给定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
它可以。只需在结构而不是指针上定义它即可。它将解决两种方式
方法集
对应的指针类型 T的方法集是接收者 T或T的所有方法的集(即,它也包含T的方法集)
尝试直播:http://play.golang.org/p/PsNUerVyqp
package main import ( "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接口来说明值和指针都满足该接口。
Abser
https://play.golang.org/p/Mls0d7_l4_t