好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 淺談Go Slice 高級實踐

淺談Go Slice 高級實踐

熱門標簽:地圖標注的汽車標 浙江高速公路地圖標注 西部云谷一期地圖標注 學海導航地圖標注 中國地圖標注省會高清 高德地圖標注口訣 江西轉化率高的羿智云外呼系統 廣州呼叫中心外呼系統 南通如皋申請開通400電話

Go 語言切片是對數組的抽象。

Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

定義切片

你可以聲明一個未指定大小的數組來定義切片:

var identifier []type

切片不需要說明長度。

或使用make()函數來創建切片:

var slice1 []type = make([]type, len)

也可以簡寫為

slice1 := make([]type, len)

也可以指定容量,其中capacity為可選參數。

make([]T, length, capacity)

這里 len 是數組的長度并且也是切片的初始長度。

以下用法中,類型均使用 int64 做為示例,不處理 interface 。

代碼只是展示實現思路,不一定完善。

合并兩個有序切片,新切片仍然有序

func MergeSortedSlice(s1, s2 []int64) []int64 {
  // 從末尾元素開始遍歷
  i := len(s1) - 1
  j := len(s2) - 1
  // 合并后的長度
  newLen := len(s1) + len(s2)
  // 合并后的索引,也從末尾元素開始
  newIdx := newLen - 1
  // 創建一個新切片,代表合并后的
  newS := make([]int64, newLen)
  // 將 s1 的內容拷貝到新切片
  for k, v := range s1 {
    newS[k] = v
  }
  // 開始遍歷
  for i >= 0  j >= 0 {
    // 新元素
    var newNum int64
    // 將較大的值賦給新元素,同時向前移動指針
    if newS[i] > s2[j] {
      newNum = newS[i]
      i--
    } else {
      newNum = s2[j]
      j--
    }
    newS[newIdx] = newNum
    newIdx--
  }
  // 如果 s2 還有剩余元素,則剩余元素一定都是最小的,直接放到頭部即可
  for j >= 0 {
    newS[newIdx] = s2[j]
    j--
    newIdx--
  }
  return newS
}

根據特定規則過濾元素

func FilterSlice(s []int64, filter func(x int64) bool) []int64 {
  // 返回的新切片
  // s[:0] 這種寫法是創建了一個 len 為 0,cap 為 len(s) 即和原始切片最大容量一致的切片
  // 因為是過濾,所以新切片的元素總個數一定不大于比原始切片,這樣做減少了切片擴容帶來的影響
  // 同時,也有一個問題,因為 newS 和 s 共享底層數組,那么過濾后 s 也會被修改!
  newS := s[:0]
  // 遍歷,對每個元素執行 filter,符合條件的加入新切片中
  for _, x := range s {
    if !filter(x) {
      newS = append(newS, x)
    }
  }
  return newS
}

去重

兩種思路,循環順序查找和使用 map 加快查找(引入一個 map 在各方面也是有開銷的)。選用哪種,可以通過具體場景的 Benchmark 決定

func RemoveDuplicates(s []int64) []int64 {
  var ret []int64
  for _, v := range s {
    found := false
    for _, v2 := range ret {
      if v == v2 {
        found = true
        break
      }
    }
    if !found {
      ret = append(ret, v)
    }
  }
  return ret
}

func RemoveDuplicates2(s []int64) []int64 {
  ret := s[:0]
  // 利用 struct{}{} 減少內存占用
  assist := map[int64]struct{}{}
  for _, v := range s {
    if _, ok := assist[v]; !ok {
      assist[v] = struct{}{}
      ret = append(ret, v)
    }
  }
  return ret
}

反轉

func Reversing(s []int64) []int64 {
  for left, right := 0, len(s)-1; left  right; left, right = left+1, right-1 {
    s[left], s[right] = s[right], s[left]
  }
  return s
}

分塊

主要用于當單個切片過大,需要分多次使用的時候,比如網絡調用等。

func SliceChunk(s []int64, size int) [][]int64 {
  var ret [][]int64
  for size  len(s) {
    // s[:size:size] 表示 len 為 size,cap 也為 size,第二個冒號后的 size 表示 cap
    s, ret = s[size:], append(ret, s[:size:size])
  }
  ret = append(ret, s)
  return ret
}

類型轉換

RPC 中,不同下游接收的類型可能不一樣,還有自定義類型,這里提供一個快速轉換的方法

s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var newS []int64
// 做法是利用 reflect 直接替換數據指針
// 但是這個不保證在以后的版本中一直可用 ╮(╯▽╰)╭
*(*reflect.SliceHeader)(unsafe.Pointer(newS)) = *(*reflect.SliceHeader)(unsafe.Pointer(s))
fmt.Printf("type:%T value:%v", newS, newS)

主要參考:https://github.com/golang/go/wiki/SliceTricks

官方使用技巧,建議多看看。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Go語言中slice作為參數傳遞時遇到的一些“坑”
  • Go基礎Slice教程詳解
  • golang常用手冊之切片(Slice)原理
  • 淺談golang slice 切片原理
  • 詳解Go中Map類型和Slice類型的傳遞
  • 深入理解golang的基本類型排序與slice排序
  • 深入解析Go語言編程中slice切片結構
  • Golang學習筆記(四):array、slice、map
  • Go語言中slice的用法實例分析
  • Go語言中的Slice學習總結

標簽:許昌 保定 常州 貴州 東營 吐魯番 曲靖 德宏

巨人網絡通訊聲明:本文標題《淺談Go Slice 高級實踐》,本文關鍵詞  淺談,Slice,高級,實踐,淺談,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談Go Slice 高級實踐》相關的同類信息!
  • 本頁收集關于淺談Go Slice 高級實踐的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产观看视频精品最新| 国模静静玉门极品美苞| 成人国产精品秘?齐天大性| 美女洗澡乳胸全身光子嫩肤| 张筱雨全棵大胆艺术| 簧色片| 99草草国产熟女视频在线| 成都私人情侣免费看电视剧的软件| 天天干天天操天天透| 自啪| 日本一级婬片免费放| 狠狠色丁香婷婷久久综合麻豆| 久久久久婷婷国产综合青草| 91免费国产在线观看尤物| 成人看片黄app免费看软件| 国产最新精品sM调教视频| 精品精品国产高清a毛片看着| 亚洲欧美日韩国产精品第不页 | 1313久久国产午夜精品理论片 | 国产人妻精品一区二区三区不卡 | 印度《性船》无删减电影| 麻豆电影免费观看| 彭丹《邪杀》在线播放| 国产真实的和子乱拍在线观看| oo0xxxx性欧美野外| 好紧好湿太硬了我太爽| 3d蒂法在线| 久久Av无码精品人妻系列希咲彩| 小小水蜜桃5[电视剧]| 黄蓉大战巨猿| 艳妇岳3p| 越堕落越快乐| 中国真人性做爰视频| 大胸奶水欲乳无码中文AV久久 | 激情视频免费| 免费A片久久久久久16色| 好看的爱情社保片aqdyen| 经典黄h长篇小说| 免费xxxx| 以女性视角写的高H爽文| 4P男男互攻两根一起呻吟声超大|