为了账号安全,请及时绑定邮箱和手机立即绑定

Go:*Var 是 Var 的“子类”吗?

Go:*Var 是 Var 的“子类”吗?

Go
绝地无双 2021-08-23 17:05:52
取自 go tour:package mainimport (    "fmt"    "math")type Abser interface {    Abs() float64}func main() {    var a Abser    f := MyFloat(-math.Sqrt2)    v := Vertex{3, 4}    a = f    a = &v    // v == Vertex != *Vertex -> exception    a = v}type MyFloat float64func (f MyFloat) Abs() float64 {    if f < 0 {        return float64(-f)    }    return float64(f)}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变成 时func (v Vertex) Abs() float64,代码编译:package mainimport (    "math")type Abser interface {    Abs() float64}func main() {    var a Abser    f := MyFloat(-math.Sqrt2)    v := Vertex{3, 4}    a = f    // Since *Vertex != Vertex, this shouldn't compile, should it?    a = &v    a = v}type MyFloat float64func (f MyFloat) Abs() float64 {    if f < 0 {        return float64(-f)    }    return float64(f)}type Vertex struct {    X, Y float64}func (v Vertex) Abs() float64 {    return math.Sqrt(v.X*v.X + v.Y*v.Y)}为什么第二个例子会运行?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

该类型*T不是 的子类T,但是*T方法集将继承 的方法T

任何其他类型 T 的方法集由所有以接收者类型 T 声明的方法组成。 对应指针类型 *T 的方法集是所有以接收者 *T 或 T 声明的方法的集合(即,它还包含方法组 T)。

因此,如果T符合特定接口,那么*T. 这就是您可以*VertexAbser示例中的变量赋值的原因。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信