golang中slice處理遇到的乙個關於引用的坑

2021-09-27 04:53:32 字數 1033 閱讀 4694

前兩天在解掃地機械人演算法的問題時,遇到乙個坑

部分**如下:

func move2(startpoint point) point }

for i := 0; i < n; i++

if !inarray(nextpoint, curfootprint) }}

allfootprint = allnewfootprint

}return allfootprint

}

這處注釋的地方非常關鍵,如果不複製出來,會導至allnewfootprint**現連續的兩個相同路徑,並且不是所有的路徑都出問題,只會在一輪迴圈結束後,新一輪迴圈開始時才會出現,當時查了半天才查出問題。

現在把這個問題單獨拎出來,分享給大家。

package main

import "fmt"

func main()

x := a[:2]

fmt.println(x)

fmt.println(a)

}

輸出:

[1 2 9]

[1 2 9 4 5 6]

上面的操作很簡單,就是從a切片裡取出前2個,然後再追加乙個數字9進去。

結果我們發現x是正確的,但a切片也隨之發生了改動。

這說明x其實只是a切片的乙個引用,對x的任何改動,都會影響到a。

這簡直是挖了個天大的坑,機械人的問題也正是這裡的問題。

只能copy出乙個新的slice方能解決這個問題

package main

import "fmt"

func main()

c := make(int, 2)

copy(c, a[:2])

fmt.println(c)

fmt.println(a)

}

輸出:

[1 2 9]

[1 2 3 4 5 6]

golang中slice的擴容機制

在golang中slice是乙個指向陣列的指標結構體。這個結構體有三個屬性 其概念為 動態陣列 及陣列的容量大小 cap 會隨著陣列的實際大小 size 變化而變化 擴容 擴容機制 如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2 一旦元素個數超過1024個元素,則乘...

golang中的空slice案例

package main func main 執行成功 補充 golang slice 詳解 func main var slice array 1 7 array startindex endindex 不包含endindex 2.直接建立陣列切片 slice2 make int,5,10 3.直...

golang 陣列 slice 亂序

陣列亂序 方法1.sliceoutoforder 選定隨機數r 將下標r和下邊i交換,i 就是和當前最後一位交換 方法2.rand.perm 陣列長度 將原陣列下標按照隨機出來的資料賦值給另一陣列 package main import fmt import math rand import tim...