GoLang定义对象接收器的方法行为错误,但指针接收器

时间:2017-05-21 03:29:22

标签: go

我有一个名为Being的界面,需要两种方法SetValue(v int)GetValue() int。然后我有一个实现它的基类Animal,还有一个继承自Cat的子类Animal

以下是代码(Go Playground):

package main

import (
    "fmt"
)

type Being interface {
    SetValue(v int)
    GetValue() int
}

type Animal struct {
    value int
}

type Cat struct {
    Animal
}

func (a Animal) SetValue(v int) {
    a.value = v
}

func (a Animal) GetValue() int {
    return a.value
}

func MakeCat() Being {
    return Cat{}
}

func main() {
    cat := MakeCat()
    cat.SetValue(1)
    fmt.Println(cat.GetValue()) 
}

但是,输出为0,而不是1

如果我稍微修改代码(Go Playground):

package main

import (
    "fmt"
)

type Being interface {
    SetValue(v int)
    GetValue() int
}

type Animal struct {
    value int
}

type Cat struct {
    Animal
}

//Change the receiver to a pointer
func (a *Animal) SetValue(v int) {
    a.value = v
}

func (a Animal) GetValue() int {
    return a.value
}

//Return the pointer
func MakeCat() Being {
    cat := Cat{}
    return &cat
}

func main() {
    cat := MakeCat()
    cat.SetValue(1)
    fmt.Println(cat.GetValue()) 
}

其中修改由注释标记,代码行为正确,并输出1

我想不出这种现象的原因,有人可以帮忙吗?

0 个答案:

没有答案