本篇內容介紹了“Go語言Slice切片操作會使原數據出現混亂的原因是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在學習Go語言的過程中,都知道可以通過切片操作來切割切片
例如
sl := make([]int,10) a = sl[1:] //表示取下標為1開始的元素到最后 b = sl[:5] //表示取下標從0開始的元素到下標為4的元素 c = sl[1:5] //表示取下標從1開始的元素到下標為4的元素 d = sl[1:5:6] //表示取下標從1開始的元素到下標為4開始的元素,并且設置新切片的容量為6 *注意,這個操作想到于對原切片進行來一個深拷貝,很關鍵
當獲取切片通過[m:n]
進行時獲取的切片都是基于原切片的底層數組的,即你該片新切片中某個數據時,原切片的數據也會被改變,這通常不是我們想要的,當然,如果使用append()
來對新切片進行操作時如果沒有發生擴容,那么原切片的值也會改變,所以,建議在進行切片獲取操作的時候盡量使用[m:n:s]
這樣通常都是開辟一個新的空間來拷貝原切片的數據,當然如果進行切片操作是要改變原切片,那么還是盡量使用[m:n]
,那么這樣會節省內存開辟的空間
代碼演示:
a := [10]int{1, 2} i := a[:6] y := []int{3,4} fmt.Printf("a->%d,a->%v\n", cap(a), a) fmt.Printf("i->%d,i->%v\n", cap(i), i) fmt.Printf("y->%d,y->%v\n", cap(y), y) fmt.Println("==============================") //i[0]=100 //fmt.Printf("a->%d,a->%v\n", cap(a), a) //fmt.Printf("i->%d,i->%v\n", cap(i), i) //fmt.Printf("y->%d,y->%v\n", cap(y), y) //fmt.Println("==============================") i = append(i, y...) fmt.Printf("a->%d,a->%v\n", cap(a), a) fmt.Printf("i->%d,i->%v\n", cap(i), i) fmt.Printf("y->%d,y->%v\n", cap(y), y)
結果:
a->10,a->[1 2 0 0 0 0 0 0 0 0] i->10,i->[1 2 0 0 0 0] y->2,y->[3 4] ============================== a->10,a->[1 2 0 0 0 0 3 4 0 0] i->10,i->[1 2 0 0 0 0 3 4] y->2,y->[3 4]
“Go語言Slice切片操作會使原數據出現混亂的原因是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。