为什么不能同时为结构及其指针定义方法?

给定golang巡回演出的第54张幻灯片中的设置:


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)

}

为什么不能同时为结构体和指向结构体的指针定义方法?那是:


func (v Vertex) Abs() float64 {

    return math.Sqrt(v.X*v.X + v.Y*v.Y)

}

定义此错误将导致以下错误:


prog.go:41: method redeclared: Vertex.Abs

    method(*Vertex) func() float64

    method(Vertex) func() float64


慕森王
浏览 174回答 2
2回答

白衣非少年

它可以。只需在结构而不是指针上定义它即可。它将解决两种方式方法集指针类型* T的方法集是接收者* T或T的所有方法的集(也就是说,它也包含T的方法集)尝试直播:http://play.golang.org/p/PsNUerVyqppackage mainimport (    "fmt"    "math"    )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)}func main() {    v := Vertex{5, 10}    v_ptr := &v    fmt.Println(v.Abs())    fmt.Println(v_ptr.Abs())}更新:根据评论,我创建了一个额外的示例,该示例实际上利用Abser接口来说明值和指针都满足该接口。https://play.golang.org/p/Mls0d7_l4_t

素胚勾勒不出你

例如,在考虑时:type T Ufunc (t *T) M() int { return 1 }var t T...我们现在可以通过编写来调用M(),t只要t.M()语言允许,即使在其基础(非指针)类型的实例上,也可以使用指针接收器调用方法,即,它等效于(&t).M()。如果现在允许它另外定义:func (t T) M() int { return 2 }...然后无法告诉现在t.M()应该返回什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go