沧海一幻觉
考虑一个简单的示例程序。AstructAPtr嵌入一个指针,a直接structAVal嵌入一个结构体:structBpackage mainimport "fmt"type structB struct { foo int}type structAPtr struct { bar *structB}type structAVal struct { bar structB}func main() { // referencing bStruct b1 := structB{foo: 12} aPtr := structAPtr{bar: &b1} fmt.Println("Before assignment:") fmt.Printf("aPtr.bar.foo = %d, b.foo = %d\n", aPtr.bar.foo, b1.foo) aPtr.bar.foo = 42 fmt.Println("After assignment:") fmt.Printf("aPtr.bar.foo = %d, b.foo = %d\n", aPtr.bar.foo, b1.foo) // copying bStruct b2 := structB{foo: 12} aVal := structAVal{bar: b2} fmt.Println("Before assignment:") fmt.Printf("aVal.bar.foo = %d, b.foo = %d\n", aVal.bar.foo, b2.foo) aVal.bar.foo = 42 fmt.Println("After assignment:") fmt.Printf("aVal.bar.foo = %d, b.foo = %d\n", aVal.bar.foo, b2.foo)}intstructB.foo用于演示在orstructB内部进行操作时是否会发生变化。structAPtrstructAVal该程序输出:Before assignment:aPtr.bar.foo = 12, b.foo = 12After assignment:aPtr.bar.foo = 42, b.foo = 42 <------------ both changedBefore assignment:aVal.bar.foo = 12, b.foo = 12After assignment:aVal.bar.foo = 42, b.foo = 12 <------------ only assignee changed查看结果显示:改变指针的值来structB改变structB更改复制版本structB的值不受影响(它仍然是,即使在被分配给之后)structAValstructB542aVal编辑:无论如何,如果您structB只有指针接收器,则预期的行为可能是更改structB更新strucA的两个接收器。这是我的示例中的场景 1,并且肯定需要一个指针。来自围棋之旅:具有指针接收器的方法可以修改接收器指向的值[...]。由于方法通常需要修改其接收器,因此指针接收器比值接收器更常见。