前兩天在解掃地機械人演算法的問題時,遇到乙個坑
部分**如下:
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...