gpt4 book ai didi

go - 为什么 slice 的内容在 GO 中没有改变?

转载 作者:IT王子 更新时间:2023-10-29 00:35:13 26 4
gpt4 key购买 nike

我以为在 GO 语言中, slice 是通过引用传递的。但是为什么下面的代码没有改变 slice c的内容呢?我错过了什么吗?谢谢你。

package main

import (
"fmt"
)


func call(c []int) {
c = append(c, 1)
fmt.Println(c)
}

func main() {
c := make([]int, 1, 5)
fmt.Println(c)
call(c)
fmt.Println(c)
}

打印出来的结果是:

[0] [0 1] [0]

在我期待的时候

[0] [0 1] [0 1]

最佳答案

slice 的长度保存在 slice 头中,不通过引用传递。您可以将 slice 视为包含指向数组的指针、长度和容量的结构。

当您追加到 slice 时,您修改了数据数组中的索引 1,然后增加了 slice header 中的长度。当您返回时,main 函数中的 c 的长度为 1,因此打印了相同的数据。

slice 以这种方式工作的原因是您可以让多个 slice 指向相同的数据。例如:

x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]

所有这三个 slice 都指向同一底层数组中的重叠数据。

关于go - 为什么 slice 的内容在 GO 中没有改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com