为什么遗忘了struct field值

时间:2015-10-26 03:10:33

标签: go

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()
}

1 个答案:

答案 0 :(得分:2)

在传递struct对象本身的第二个示例中,您是一个指针接收器。您看到了更改,因为您实际上已修改了原始对象。在第一个示例中,您传递的是包含相同值的对象的副本,您正在使用值接收器。您没有看到更改,因为原始对象未更改。

为了说服自己,您可以在myclasspath2main方法中打印对象的地址。

使用指针接收器时:

主要:

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