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} 的一個(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]]。
測試代碼
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學(xué)習(xí)筆記(四):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)文章
Golang中處理import自定義包出錯(cuò)問題的解決辦法
最近開始使用Go/GoLand在import自定義包時(shí)出現(xiàn)各種狀況,下面這篇文章主要給大家介紹了關(guān)于Golang中處理import自定義包出錯(cuò)問題的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Go語言defer與return執(zhí)行的先后順序詳解
這篇文章主要為大家介紹了Go語言defer與return執(zhí)行的先后順序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
快速掌握Go 語言 HTTP 標(biāo)準(zhǔn)庫的實(shí)現(xiàn)方法
基于HTTP構(gòu)建的服務(wù)標(biāo)準(zhǔn)模型包括兩個(gè)端,客戶端(Client)和服務(wù)端(Server),這篇文章主要介紹了Go 語言HTTP標(biāo)準(zhǔn)庫的實(shí)現(xiàn)方法,需要的朋友可以參考下2022-07-07

