Golang?range?slice?與range?array?之間的區(qū)別
結(jié)構(gòu)圖:
為什么?
var data [][]int for _, rangeSlice := range [][]int{{1}, {2}, {3}} { data = append(data, rangeSlice[:]) } fmt.Printf("%v", data) // 輸出 [[1] [2] [3]]
var data [][]int for _, rangeArray := range [][1]int{{1}, {2}, {3}} { data = append(data, rangeArray[:]) } fmt.Printf("%v", data) // 輸出 [[3] [3] [3]]
理解
for key, value := range container{ // loop }
在 for range
語(yǔ)法中,value
是 for range
循環(huán)返回元素的值的拷貝。
case rangeSlice
var data [][]int for _, rangeSlice := range [][]int{{1}, {2}, {3}} { data = append(data, rangeSlice[:]) } fmt.Printf("%v", data) // 輸出 [[1] [2] [3]]
代碼中,rangeSlice
是切片 []int{1}
or []int{2}
or []int{3}
的一個(gè)拷貝,底層是數(shù)組 [1]int{1}
or [1]int{2}
or [1]int{3}
,所以在 rangeSlice
的切片 append
到 data
后,data
的元素也是這幾個(gè)底層數(shù)組的切片,所以上述代碼片段的輸出為 [[1] [2] [3]]
。
case rangeArray
var data [][]int for _, rangeArray := range [][1]int{{1}, {2}, {3}} { data = append(data, rangeArray[:]) } fmt.Printf("%v", data) // 輸出 [[3] [3] [3]]
代碼中,rangeArray
是數(shù)組 [1]int{1}
or [1]int{2}
or [1]int{3}
的一個(gè)拷貝,在每次循環(huán)中,rangeArray
用的都是同一個(gè)數(shù)組內(nèi)存空間,所以在 rangeArray
這個(gè)數(shù)組的切片 append
到 data
后,data
的元素都是指向同一底層數(shù)組的切片,在循環(huán)的最后一輪 rangeArray
為 [1]int{3}
,所以上述代碼片段的輸出為 [[3] [3] [3]]
。
測(cè)試代碼
package main import "fmt" func rangeSlice() { source := [][]int{{1}, {2}, {3}} var data [][]int for idx, rangeSlice := range source { fmt.Printf("%T %p %T %p", rangeSlice, rangeSlice, source[idx], source[idx]) fmt.Printf(" append slice %p\n", rangeSlice[:]) data = append(data, rangeSlice[:]) } fmt.Printf("data: %v\n", data) } func rangeArray() { source := [][1]int{{1}, {2}, {3}} var data [][]int for idx, rangeArray := range source { fmt.Printf("%T %p %T %p", rangeArray, &rangeArray, source[idx], &source[idx]) fmt.Printf(" append slice %p\n", rangeArray[:]) data = append(data, rangeArray[:]) } fmt.Printf("data: %v\n", data) } func main() { rangeSlice() rangeArray() } // 輸出: // []int 0xc00001a0a8 []int 0xc00001a0a8 append slice 0xc00001a0a8 // []int 0xc00001a0b0 []int 0xc00001a0b0 append slice 0xc00001a0b0 // []int 0xc00001a0b8 []int 0xc00001a0b8 append slice 0xc00001a0b8 // data: [[1] [2] [3]] // [1]int 0xc00001a0e0 [1]int 0xc0000160f0 append slice 0xc00001a0e0 // [1]int 0xc00001a0e0 [1]int 0xc0000160f8 append slice 0xc00001a0e0 // [1]int 0xc00001a0e0 [1]int 0xc000016100 append slice 0xc00001a0e0 // data: [[3] [3] [3]]
到此這篇關(guān)于Golang range slice 與range array 之間的區(qū)別的文章就介紹到這了,更多相關(guān)Golang range slice 與 range array 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- go語(yǔ)言中切片Slice與數(shù)組Array對(duì)比以及panic:?runtime?error:?index?out?of?range問(wèn)題解決
- GO中?分組聲明與array,?slice,?map函數(shù)
- Golang 拷貝Array或Slice的操作
- Go 修改map slice array元素值操作
- Golang學(xué)習(xí)筆記(四):array、slice、map
- Go語(yǔ)言入門(mén)教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)
- 理解Golang中的數(shù)組(array)、切片(slice)和map
- Go語(yǔ)言中的Array、Slice、Map和Set使用詳解
- GO語(yǔ)言的數(shù)組array與切片slice詳解
相關(guān)文章
Go位集合相關(guān)操作bitset庫(kù)安裝使用
這篇文章主要為大家介紹了Go位集合相關(guān)操作bitset庫(kù)安裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Golang中結(jié)構(gòu)體映射mapstructure庫(kù)深入詳解
mapstructure用于將通用的map[string]interface{}解碼到對(duì)應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時(shí)候,解析來(lái)自多種源頭的數(shù)據(jù)流時(shí),我們一般事先并不知道他們對(duì)應(yīng)的具體類(lèi)型。只有讀取到一些字段之后才能做出判斷2023-01-01Go語(yǔ)言使用ioutil.ReadAll函數(shù)需要注意基本說(shuō)明
這篇文章主要為大家介紹了Go語(yǔ)言使用ioutil.ReadAll函數(shù)需要注意基本說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07