2 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
Go 中的切片實(shí)際上由一個(gè)帶有元信息的結(jié)構(gòu)和一個(gè)指向存儲(chǔ)實(shí)際數(shù)據(jù)的連續(xù)內(nèi)存位置的指針組成。即使您toSort
按值傳遞,復(fù)制的元結(jié)構(gòu)仍然引用相同的底層內(nèi)存位置。這就是為什么toSort
也會(huì)改變。
如果您不希望這種情況發(fā)生,您可以使用 copy 創(chuàng)建一個(gè)新切片并將其傳遞。
切片內(nèi)部:https ://blog.golang.org/slices-intro
復(fù)制:https ://golang.org/pkg/builtin/#copy

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
切片只是指向基礎(chǔ)數(shù)據(jù)的指針,因此當(dāng)您更新給定參數(shù)時(shí),您正在更改實(shí)際數(shù)據(jù)。這就是您需要復(fù)制數(shù)據(jù)的原因:
func copySlice(s []int) []int {
c := make([]int, len(s))
copy(c, s)
return c
}
func main() {
toSort := []int{100, 20, 70, 30, 90, 40, 120, 123, 10, 23}
sorted := sorting.QuickSort(copySlice(toSort))
fmt.Println(toSort)
fmt.Println(sorted)
}
- 2 回答
- 0 關(guān)注
- 164 瀏覽
添加回答
舉報(bào)