http://play.golang.org/p/wU44VOa_uP
这是一个简单的例子:
package main
import "fmt"
type Holder struct {
i int
}
func (h Holder) SetMember(i1 int) {
fmt.Println(i1)
h.i = i1
}
func (h Holder) GetMember() int {
fmt.Println(h.i)
return h.i
}
func main() {
c := Holder{i:3}
c.SetMember(5)
c.GetMember()
}
我可能错过了关于golang的一个非常基本的事实。 设置后为什么值5不粘?
此示例有效: http://play.golang.org/p/j8hdKWPdsc
package main
import "fmt"
type Holder struct {
i int
}
func (h *Holder) SetMember(i1 int) {
fmt.Println(i1)
h.i = i1
}
func (h *Holder) GetMember() int {
fmt.Println(h.i)
return h.i
}
func main() {
c := &Holder{i:3}
c.SetMember(5)
c.GetMember()
}
答案 0 :(得分:2)
在传递struct对象本身的第二个示例中,您是一个指针接收器。您看到了更改,因为您实际上已修改了原始对象。在第一个示例中,您传递的是包含相同值的对象的副本,您正在使用值接收器。您没有看到更改,因为原始对象未更改。
为了说服自己,您可以在myclasspath2
和main
方法中打印对象的地址。
使用指针接收器时:
主要:
SetMember
在fmt.Printf("address in main: %p\n", c)
中(应与主要内容相同):
SetMember
使用价值接收器时:
主要:
fmt.Printf("address in SetMember: %p\n", h)
在fmt.Printf("address in main: %p\n", &c)
中(应与主要内容不同):
SetMember