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

取自 go tour:


package main


import (

    "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 float64


func (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 main


import (

    "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 float64


func (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)

}

为什么第二个例子会运行?


绝地无双
浏览 203回答 1
1回答

开心每一天1111

该类型*T不是 的子类T,但是*T的方法集将继承 的方法T:任何其他类型 T 的方法集由所有以接收者类型 T 声明的方法组成。 对应指针类型 *T 的方法集是所有以接收者 *T 或 T 声明的方法的集合(即,它还包含方法组 T)。因此,如果T符合特定接口,那么*T.&nbsp;这就是您可以*Vertex为Abser示例中的变量赋值的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go