我正在经历围棋之旅。我了解到,如果我们有一个接受指针作为接收器的方法,它也会接受一个值类型作为接收器(go 会自动进行转换)。
type Vertex struct { X, Y float64 }
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X * v.X + v.Y * v.Y)
}
Run Code Online (Sandbox Code Playgroud)
那么下面的代码是有效的,无论Vertex是按值还是按指针接收
v := Vertex{1, 2}
fmt.Println(v.Abs())
p := &v
fmt.Println(p.Abs())
Run Code Online (Sandbox Code Playgroud)
但是,假设我们有以下接口:
type Abser interface {
Abs() float64
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么下面的代码无效呢?
var a Abser
v := Vertex{1, 2}
a = v // invalid
Run Code Online (Sandbox Code Playgroud)
我的理解是这样就好了。即使 v 是“实现”接受指针接收器的 Abs 函数的值类型,它也会按值接受它?
就接口变量可以在右侧保存的内容而言,接口是否只是设计得更加严格?该接口将 *Vertex 和 Vertex 视为两种不同的类型,但是, Abs() 方法也没有问题处理。
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |