鉴于设置第 54 张幻灯片 http://tour.golang.org/#54golang之旅:
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
它可以。只需在结构体上定义它而不是指针。它将以两种方式解决
方法集 http://golang.org/ref/spec#Method_sets
对应指针类型*T的方法集是所有的集合
带有接收者 *T 或 T 的方法(也就是说,它还包含方法
一套T)
尝试直播:http://play.golang.org/p/PsNUerVyqp 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())
}
Update:根据评论,我创建了一个额外的示例,该示例实际上利用了Abser
接口来说明值和指针都满足接口。
https://play.golang.org/p/Mls0d7_l4_t https://play.golang.org/p/Mls0d7_l4_t
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)