go切片的copy和view的使用方法

2022-09-24 14:42:14 字數 1592 閱讀 1893

語義理解切片

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...