Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go子片指针引用_Go - Fatal编程技术网

Go子片指针引用

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 }

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
    }

    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]