鉴于golang之旅54th slide中的设置:
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)
}
为什么不能为struct定义一个方法以及指向struct的指针?那就是:
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
答案 0 :(得分:11)
它可以。只需在结构上定义它而不是指针。它将解决两种方式
相应指针类型* T的方法集是all的集合 接收器* 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())
}
答案 1 :(得分:4)
虽然考虑例如:
type T U
func (t *T) M() int { return 1 }
var t T
...我们现在可以通过编写M()
来t
调用t.M()
,因为语言允许使用指针接收器调用方法,即使在其底层(非指针)类型的实例上也是如此,即它等同于(&t).M()
。
如果允许现在另外定义:
func (t T) M() int { return 2 }
...然后没有办法告诉现在t.M()
应该返回什么。