【发布时间】:2017-09-18 16:39:52
【问题描述】:
我对将切片传递给函数有疑问。
如果我没记错的话,切片是在 Go 中通过引用传递的,所以如果我这样做:
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 函数实际上会更改原始切片中的值,因为它是通过引用传递的(默认情况下)。
有一些简单的方法可以直接将切片的副本传递给testSlice 函数吗?
当然我可以这样做来创建切片的副本:
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
}
但是它需要遍历原始切片中的所有值来复制它们,并且这似乎不是一个很好的解决方案。
【问题讨论】: