Golang中这段代码的输出结果谁能帮忙解释一下

Golang中这段代码的输出结果谁能帮忙解释一下 Go Playground 链接

7 回复

什么让你感到惊讶?

更多关于Golang中这段代码的输出结果谁能帮忙解释一下的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢Marcelo,你解释得非常清楚。

实际上,你只是在重新分配局部变量(你的指针)。这对原始指针变量没有影响。

是的,但我在用手机,所以今天不多说了,不过也许你应该在函数和方法中赋值给 *s

func(s *Sample)Reset(){
s = &Sample{}
}

在这个方法中,我将 s 分配给了其他地址。但 s 仍然保持不变。

考虑一下 s = &Sample{} 的作用。它修改的是 s(而不是 *s)。s 是通过值传递传递给 Reset() 的,因此它被视为一个新的局部变量。所以当函数返回时,s 就被遗忘了。

当然,如果你需要真正重置,你需要执行 *s = Sample{},这样 s 指向的值就会被清空。或者你可以使用 (*s).data = ""(*s).m = map[string]string{} 来单独清除各个字段。

func main() {
    fmt.Println("hello world")
}

这是一个关于Go语言中切片(slice)和数组(array)行为的经典问题。让我逐步解释代码中的关键点,并预测输出结果。

首先,代码定义了一个数组 a 并初始化,然后创建了两个切片 s1s2

a := [5]int{1, 2, 3, 4, 5}
s1 := a[0:3]
s2 := a[2:5]

此时内存布局如下:

  • 数组 a: [1, 2, 3, 4, 5]
  • 切片 s1 引用 a[0:3][1, 2, 3]
  • 切片 s2 引用 a[2:5][3, 4, 5]

关键点s1s2 共享底层数组 a 的相同元素(索引2处的值3)。

当执行 s1[2] = 9 时:

s1[2] = 9

这会修改底层数组 a 中索引2位置的值,将3改为9。由于 s2[0] 也引用同一个位置,所以:

  • 数组 a 变为: [1, 2, 9, 4, 5]
  • 切片 s1 变为: [1, 2, 9]
  • 切片 s2 变为: [9, 4, 5]

因此,最终输出将是:

s1: [1 2 9]
s2: [9 4 5]
a: [1 2 9 4 5]

这个例子展示了Go语言中切片作为数组"视图"的特性——多个切片可以共享同一个底层数组,修改其中一个切片会影响其他共享相同底层数据的切片。

回到顶部