Go 为什么可以';不能同时为结构和指针定义方法吗?
根据golang tour中的设置:Go 为什么可以';不能同时为结构和指针定义方法吗?,go,Go,根据golang tour中的设置: 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 m
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
例如,在考虑:
type T U
func (t *T) M() int { return 1 }
var t T
…我们现在可以通过编写t.M()
来调用t上的M()
,因为语言允许使用指针接收器调用方法,即使是在其底层(非指针)类型的实例上,也可以这样做,也就是说,它变得相当于(&t).M()
如果现在允许额外定义:
func (t T) M() int { return 2 }
…那么就没有办法知道现在应该返回什么了。它可以。只需在结构而不是指针上定义它。这将从两方面解决问题
对应指针类型*T的方法集是所有
带有receiver*T或T的方法(也就是说,它还包含方法
一组(T)
尝试直播:
更新:根据评论,我创建了一个额外的示例,实际使用Abser
接口来说明值和指针都满足接口
类型Abser接口未使用。@Tom L你是说你的IDE抱怨你的接口未使用?它可能看不到同一个库中实现接口的任何内容。您的实际观点或问题是什么?您出色的围棋示例(可以理解地反映了问题)也可以“双向解决”,而无需使用键入Abser接口。
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())
}