日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 分布式学习利器(5)-- 数组和切片

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 分布式学习利器(5)-- 数组和切片 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 數(shù)組的聲明
    • 2. 數(shù)組元素的遍歷
    • 3. 數(shù)組的截取
    • 4. Go 語言的切片
    • 5. 數(shù)組 和 切片的共同點

1. 數(shù)組的聲明

  • 聲明并初始化為默認的零值 var a [3]int
  • 聲明同時初始化為指定的值 b := [3]int{1,2,3}
  • 多維數(shù)組初始化 c := [2][2]int{{1,2},{3,4}}

測試函數(shù):

func TestArrayInit(t *testing.T) {var a [3]intt.Log(a[1], a[2])b := [3]int{1,2,3}t.Log(b[1],b[2],b[0])c := [2][2]int{{1,2},{3,4}}t.Log(c[0][0],c[0][1])
}

2. 數(shù)組元素的遍歷

  • 像其他語言一樣的下標遍歷方式:
    a := [3]int{3,4,5}
    for i := 0; i < len(a); i++ {t.Log(a[i])
    }
    
  • 類似與C++的foreach方式遍歷
    for idx, v := range a{t.Log(idx, v)
    }
    

測試函數(shù)如下:

func TestArrayTravel(t *testing.T) {a := [3]int{3,4,5}for i := 0; i < len(a); i++ {t.Log(a[i])}/* method 1 */for idx, v := range a{t.Log(idx, v)}/*_ 表示占位,只想要取元素,而不取下標*/for _, v := range a{t.Log( v)}
}

測試函數(shù)運行,直接命名一個array_test.go文件,增加package和import testing,通過go test -v array_test.go運行即可。

3. 數(shù)組的截取

主要用法:a[開始索引(包含),結(jié)束索引(不包含)]
比如:a := [...]int{1,2,3,4,5}

  • a[1:2] 當前截取的內(nèi)容只有 2, 左閉右開,只有a[1]
  • a[1:3] 當前截取的內(nèi)容有2,3
  • [1,len(a)] 2,3,4,5
  • a[1:] 2,3,4,5
  • a[:3] 1,2,3
  • 不支持 負數(shù),a[1:-1] 取倒數(shù)第一個元素,Go語言不支持這樣的操作

測試函數(shù)是:

func TestArrayCut(t *testing.T) {a := [...]int{1,2,3,4,5}a1 := a[1:2]t.Log(a1)a2 := a[1:3]t.Log(a2)a3 := a[1:]t.Log(a3)a4 := a[:3]t.Log(a4)
}

4. Go 語言的切片

Go語言的切片 是一種在數(shù)組之上的抽象結(jié)構(gòu),可變長。當然,數(shù)組的本質(zhì)是指針,所以這里go語言的形態(tài)就類似與我們的C++STL中的vector,擁有數(shù)組長度和數(shù)組容量。

基本結(jié)構(gòu)如下:

其中l(wèi)en 為數(shù)組的長度,cap為數(shù)組的容量,基本分片使用方式類似如下測試函數(shù)。

測試函數(shù)如下:

func TestArraySlice(t *testing.T) {var s [] intt.Log(len(s), cap(s)) // 輸出 0 0s = append(s, 1) // 向分片中增加數(shù)據(jù)t.Log(len(s), cap(s)) // 輸出:1 1s1 := []int{1,2,3}t.Log(len(s1), cap(s1)) // 輸出:3 3s2 := make([]int, 3, 5)t.Log(len(s2), cap(s2)) // 輸出 3 5t.Log(s2[0],s2[1],s2[2]) // 輸出輸出s2[3] 則會報錯,超出數(shù)組范圍s2 = append(s2, 4) // 追加一個元素t.Log(len(s2), cap(s2)) // 輸出 4 5
}

看到可變長,就想到了C++的STL,基本都是可變長存儲結(jié)構(gòu),其中vector 模版可以和Go語言這里的切片進行類比。到這里,我們即能夠想到vector的可變長即動態(tài)擴容是通過 重新分配一個2倍于原空間的存儲空間,將當前連續(xù)存儲的內(nèi)存空間中的數(shù)據(jù)拷貝到分配好的存儲結(jié)構(gòu)。
關(guān)于C++ vector的實現(xiàn),感興趣的伙伴可以參考C++ STL 源碼分析 了解一下

這里關(guān)于Go的切片 動態(tài)擴容的測試函數(shù)如下:

func TestSliceGrowing(t *testing.T) {var s[] intfor i := 0;i < 10; i++{s = append(s, i) t.Log(len(s), cap(s))}
}

go test -v slice_test.go輸出如下:

=== RUN   TestSliceGrowingslice_test.go:26: 1 1slice_test.go:26: 2 2slice_test.go:26: 3 4slice_test.go:26: 4 4slice_test.go:26: 5 8slice_test.go:26: 6 8slice_test.go:26: 7 8slice_test.go:26: 8 8slice_test.go:26: 9 16slice_test.go:26: 10 16

可以看到Go 的len和cap之間的關(guān)系,切片動態(tài)擴容也是二倍于之前的容量。
所以可以看到切片 在增加元素時通過s = append(s, i)代碼,即在存儲空間動態(tài)增長時 地址不一定是固定的,在達到cap容量的限制的時候會將地址指向新的存儲空間,而這個新的存儲空間大小二倍于原來的存儲空間。

切片本質(zhì)是共享存儲結(jié)構(gòu):


如上圖,有兩個切片指針:Q2summer
他們能夠共享[April,December]這段區(qū)間的空間,Q2可以只有三個元素,容量卻能夠達到9個,同理summber也只有三個元素,容量也能夠達到7個;兩個指針在動態(tài)增長的過程中使用相同的存儲區(qū)域也是Go語言切片結(jié)構(gòu)所支持的。

測試函數(shù)如下:

func TestSliceSharedMem(t *testing.T) {year := []string{"Jun","Feb","Mar","Apri","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}Q2 := year[3:6] // 共享year的存儲空間t.Log(Q2, len(Q2),cap(Q2))summer := year[3:8] // 共享yead的存儲空間t.Log(summer, len(summer), cap(summer))summer[0] = "unkown" // 修改summer的第一個元素t.Log(Q2) // 確認Q2是否也會被修改
}

輸出如下:

=== RUN   TestSliceSharedMemslice_test.go:34: [Apri May Jun] 3 9slice_test.go:37: [Apri May Jun Jul Aug] 5 9slice_test.go:40: [unkown May Jun] 
--- PASS: TestSliceSharedMem (0.00s)

兩個共享存儲的切片結(jié)構(gòu),修改了其中一個切片結(jié)構(gòu)的內(nèi)容summer,那么另一個切片結(jié)構(gòu)Q2的存儲內(nèi)容也會隨之發(fā)生變化。

5. 數(shù)組 和 切片的共同點

  • 數(shù)組容量不可伸縮,切片元素容量可伸縮
  • 數(shù)組在相同容量,相同元素個數(shù)情況下是可以進行比較,切片不能夠進行比較

總結(jié)

以上是生活随笔為你收集整理的Go 分布式学习利器(5)-- 数组和切片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。