我只是在學習轉到我對將slices
傳遞給函數有疑問。如何將切片的副本傳遞給函數?
如果我沒看錯的slices
通過引用圍棋過去了,所以如果我做這樣的事情:
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)
testSlice(slice)
fmt.Println(slice)
}
func testSlice(slice []int) {
slice[0] = 5
slice[4] = 1
}
的testSlice
功能實際上將改變原來的slice
的值,因爲它通過引用傳遞(默認情況下)。
有一些簡單的方法,我可以直接將slice
的副本傳遞給testSlice
函數?
當然,我可以做這樣的事情來創建slice
的副本:
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)
testSlice(slice)
fmt.Println(slice)
}
func testSlice(slice []int) {
var newSlice []int
for i := 0; i < len(slice); i++ {
newSlice = append(newSlice, slice[i])
}
newSlice[0] = 5
newSlice[4] = 1
}
但它需要經過所有的值在原slice
複製他們每個人,它似乎並不成爲一個很好的解決方案。
謝謝@Nevermore,這是一個更優雅的方式來複制'切片'。只想確認一下。我無法直接將'slice'拷貝傳遞給一個函數?唯一的方法是手動創建一個新的「切片」並複製原始「切片」中的值?我只是問它,因爲我來自'C++',在那裏我可以通過引用或值傳遞向量。 – KelvinS
@KelvinSalton去絕對沒有「通過參考」的概念。一切都通過價值傳遞。切片是一個底層數組的描述符。如果您想要數組的那部分副本,則必須複製副本。Go的焦點不是「優雅」或「語法糖」,而是「明確的」: – Volker
謝謝@Volker,現在更清晰了。 – KelvinS