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 語法中,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} 的一個拷貝,底層是數(shù)組 [1]int{1} or [1]int{2} or [1]int{3},所以在 rangeSlice 的切片 append 到 data 后,data 的元素也是這幾個底層數(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} 的一個拷貝,在每次循環(huán)中,rangeArray 用的都是同一個數(shù)組內(nèi)存空間,所以在 rangeArray 這個數(shù)組的切片 append 到 data 后,data 的元素都是指向同一底層數(shù)組的切片,在循環(huán)的最后一輪 rangeArray 為 [1]int{3},所以上述代碼片段的輸出為 [[3] [3] [3]]。
測試代碼
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- go語言中切片Slice與數(shù)組Array對比以及panic:?runtime?error:?index?out?of?range問題解決
- GO中?分組聲明與array,?slice,?map函數(shù)
- Golang 拷貝Array或Slice的操作
- Go 修改map slice array元素值操作
- Golang學習筆記(四):array、slice、map
- Go語言入門教程之Arrays、Slices、Maps、Range操作簡明總結(jié)
- 理解Golang中的數(shù)組(array)、切片(slice)和map
- Go語言中的Array、Slice、Map和Set使用詳解
- GO語言的數(shù)組array與切片slice詳解
相關(guān)文章
Go語言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解
這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解
mapstructure用于將通用的map[string]interface{}解碼到對應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時候,解析來自多種源頭的數(shù)據(jù)流時,我們一般事先并不知道他們對應(yīng)的具體類型。只有讀取到一些字段之后才能做出判斷2023-01-01
Go語言使用ioutil.ReadAll函數(shù)需要注意基本說明
這篇文章主要為大家介紹了Go語言使用ioutil.ReadAll函數(shù)需要注意基本說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

