我只是在学习转到我对将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