Go子片指针引用
s的结果是[1,2,3],我认为切片包含对底层数组的引用。不是这样吗Go子片指针引用,go,Go,s的结果是[1,2,3],我认为切片包含对底层数组的引用。不是这样吗 package main import ( "fmt" ) func main() { s := []int{1, 2, 3} ss := s[1:] ss = append(ss, 4) for _, v := range ss { v += 10 } for i := range ss { ss[i] += 10 }
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
ss := s[1:]
ss = append(ss, 4)
for _, v := range ss {
v += 10
}
for i := range ss {
ss[i] += 10
}
fmt.Println(s)
}
似乎您已经创建了切片s的副本,并且您已经对切片副本ss进行了更改,认为这些更改也将传递给创建副本的切片 第一个for循环也遍历slice ss的元素,但实际上并没有对它们做任何操作,因为range在提供元素值时也会创建一个副本,所以它实际上什么都不做 您似乎正在尝试执行以下操作: 将值4追加到切片s 从切片的索引1到切片的末尾,取每个值,然后加10 如果是这样,这将有助于您实现以下目标: 包干管 进口 fmt func main{ s:=[]int{1,2,3} s=附录,4 对于i:=范围s{ 如果i==0{ 持续 } s[i]+=10 } 打印格式 } 你可以在运动场上看到: 我认为切片包含对底层数组的引用。不是这样吗 是的。但您使用以下语句创建了一个长度为3的数组:
s := []int{1, 2, 3}
ss = append(ss, 4)
当您向ss追加一个元素时,需要分配一个新的、更长的数组。所以你失去了ss和s之间的联系
s := []int{1, 2, 3}
ss = append(ss, 4)
您可以通过运行此示例来验证:
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
ss := s[1:]
ss[0] += 5
ss = append(ss, 4)
ss[0] += 100
fmt.Println(s)
}
package main
import (
"fmt"
)
func main() {
s := make([]int, 3, 4)
s[0], s[1], s[2] = 1, 2, 3
ss := s[1:]
ss = append(ss, 4)
for i := range ss {
ss[i] += 10
}
fmt.Println(s)
}
它打印[1 7 3]
如果将s的初始化更改为长度大于3,则不需要新的阵列分配,并且s和ss之间的链接将保持:
package main
import (
"fmt"
)
func main() {
s := make([]int, 3, 4)
s[0], s[1], s[2] = 1, 2, 3
ss := s[1:]
ss[0] += 5
ss = append(ss, 4)
ss[0] += 100
fmt.Println(s)
}
输出:[1 107 3]
将问题归结为切片的范围副本的答案是不正确的,可以通过以下示例显示:
package main
import (
"fmt"
)
func main() {
s := []int{1, 2, 3}
ss := s[1:]
ss[0] += 5
ss = append(ss, 4)
ss[0] += 100
fmt.Println(s)
}
package main
import (
"fmt"
)
func main() {
s := make([]int, 3, 4)
s[0], s[1], s[2] = 1, 2, 3
ss := s[1:]
ss = append(ss, 4)
for i := range ss {
ss[i] += 10
}
fmt.Println(s)
}
输出:[1 12 13]