7 回复
谢谢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 并初始化,然后创建了两个切片 s1 和 s2:
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]
关键点:s1 和 s2 共享底层数组 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语言中切片作为数组"视图"的特性——多个切片可以共享同一个底层数组,修改其中一个切片会影响其他共享相同底层数据的切片。

