您好,登錄后才能下訂單哦!
語義理解切片
go 語言中的切片是 go 語言的一個特色,從語義上來說,切片就是把一個整體的東西切分成小的部分,那么對于語言中的切片也是同理。
舉個例子看如下代碼:
package main import "fmt" func main() { arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println("arr[2:6]:", arr[2:6]) // 從下標2到下標6 fmt.Println("arr[: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 數(shù)組的哪一部分,我們就切哪一部分。
當然,如果僅僅知道切片是這么用的當然還不夠,我們應該更加深入的理解,如:
對原數(shù)組的 copy 還是 view 。
對于 go 語言的數(shù)組,copy 和 view 是同時都存在的。
copy 場景
package main import ( "fmt" ) func updateArr(arr [5]int) { arr[0] = 100 fmt.Println("修改后的arr:", arr) } func main() { arr3 := [...]int{2, 4, 5, 6, 7} 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 的值,但是我們輸出原始數(shù)組的時候,并沒有變。這就是對數(shù)組 copy。
view 場景
func updateArr(arr []int) { arr[0] = 100 fmt.Println("修改后的arr:", arr) } func main() { arr3 := [...]int{2, 4, 5, 6, 7} 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 能夠改變原數(shù)組
雖然 Slice 本身是值類型,但是它內(nèi)部使用了對數(shù)組的指針引用,所以修改切片數(shù)據(jù),會將數(shù)組原有數(shù)據(jù)修改掉。
當然,在理解上面的同時,一定要知道 go 是如何定義一個切片的
var b []int
所以,在 updateArr 這個函數(shù)傳參的時候 arr []int 是傳切片進去。不然會報錯。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。