語義理解切片
go 語言中的切片是 go 語言的乙個特色,從語義上來說,切片就是把乙個整體的東西切分成小的部分,那麼對於語言中的切片也是同理。
舉個例子看如下**:
package main
import "fmt"
fun程式設計客棧c main()
fmt.println("arr[2:6]:", arr[2:6]) // 從下skctsydmee標2到下標6
fmt.println("askctsydmeerr[:6]:", arr[:6]) // 從下標0到下標6
fmt.println("arr[2:]:", 程式設計客棧arr[2:]) // 從下標2到最後
fmt.println("arr[:]:", arr[:]) // 全部
}輸出結果為:
arr[2:6]: [2 3 4 5]
arr[:6]: [0 1 2 3 4 5]
arr[2:]: [2 3 4 5 6 7]
arr[:]: [0 1 2 3 4 5 6 7]
這裡可以很明確的看出,我們想要 arr 陣列的哪一部分,我們就切哪一部分。
當然,如果僅僅知道切片是這麼用的當然還不夠,我們應該更加深入的理解,如:
對原陣列的 copy 還是 view 。
對於 go 語言的陣列,copy 和 view 是同時都存在的。
copy 場景
package main
import (
"fmt"
)func updatearr(arr [5]int)
func main()
fmt.println("原來的:", arr3)
updatearr(arr3)
fmt.println("再次檢視原始的:", arr3)
}輸出結果:
原來的: [2 4 5 6 7]
修改後的arr: [100 4 5 6 7]
再次檢視原始的: [2 4 5 6 7]
如上**可以看到,我們在 updatearr 裡面修改了下標為 0 的值,但是我們輸出原始陣列的時候,並沒有變。這就是對陣列 copy。
view 場景
func updatearr(arr int)
func main()
fmt.println("原來的:", arr3)
// 使用切片
updatearr(arr3[:])
fmt.println("再次檢視原始的:", arr3)
}輸出結果:
程式設計客棧原來的: [2 4 5 6 7]
修改後的arr: [100 4 5 6 7]
再次檢視原始的: [100 4 5 6 7]
為什麼 view 能夠改變原陣列
雖然 slice 本身是值型別,但是它內部使用了對陣列的指標引用,所以修改切片資料,會將陣列原有資料修改掉。
當然,在理解上面的同時,一定要知道 go 是如何定義乙個切片的
var b int
所以,在 updatearr 這個函式傳參的時候 arr int 是傳切片進去。不然會報錯。
本文標題: go切片的copy和view的使用方法
本文位址:
3 5 Go語言copy 切片複製(切片拷貝)
go語言的內建函式 copy 可以將乙個陣列切片複製到另乙個陣列切片中,如果加入的兩個陣列切片不一樣大,就會按照其中較小的那個陣列切片的元素個數進行複製。copy 函式的使用格式如下 copy destslice,srcslice t int其中 srcslice 為資料 切片,destslice ...
Go 陣列和切片
陣列擷取 a 開始索引位置,結束索引 切片 slice 是本身並非動態陣列和陣列指標,通過內部指標指向底層陣列。建立乙個length和capacity都等於5的slice slice make int,5 length 3,capacity 5的slice slice make int,3,5 建立...
Go語言的切片
go 語言切片是對陣列的抽象。go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。在一定程度上可以看做乙個動態陣列 切片的方式 1.var identifier...