Golang巡演#55和#57中的界面和指针

时间:2014-07-14 15:08:31

标签: go

在这两个教程示例中,为什么带指针接收器的方法在一种情况下满足接口而在另一种情况下不满足另一种情况?

example #55中,班级Vertex并不满足Abser界面,因为方法Abs仅定义为*Vertex而不是{{1} }}:

Vertex

错误消息是:

type Abser interface {
    Abs() float64
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

但在example #57中,即使为prog.go:22: cannot use v (type Vertex) as type Abser in assignment: Vertex does not implement Abser (Abs method has pointer receiver) 而非MyError定义了error,班级Error()也能满足*MyError界面的要求:

MyError

this answer中的描述看起来两者都应该可以正常工作,但是教程演示了第一个失败。有什么区别?

3 个答案:

答案 0 :(得分:6)

在example57中,错误返回如下:

return &MyError{
    time.Now(),
    "it didn't work",
}

这将返回指向MyError结构的指针。 *MyError满足界面。

在例55中,也指出了这一点:

a = &v // a *Vertex implements Abser

// In the following line, v is a Vertex (not *Vertex)
// and does NOT implement Abser.
a = v

正如你所指的答案中所述,生成发生在相反的情况下(*MyStruct类型将具有所有方法MyStruct

答案 1 :(得分:3)

在#57中,只有*MyError符合error。如您所见,run()返回的值为*MyError,而不是MyError

func run() error {
    return &MyError{ // <<< Notice the '&'.
        time.Now(),
        "it didn't work",
    }
}

答案 2 :(得分:3)

#57中,它返回一个指向我的错误的指针:

return &MyError{ //notice the "&", that means return the address / pointer to that struct.
    time.Now(),
    "it didn't work",
}