1

这是我正在查看的代码和描述的链接:https ://tour.golang.org/methods/11

我将 *T 类型的方法 M 更改为 T,即从指针接收器更改为值接收器,如下所示。

package main

import (
    "fmt"
    "math"
)

type I interface {
    M()
}

type T struct {
    S string
}

func (t T) M() {
    fmt.Println(t.S)
}

type F float64

func (f F) M() {
    fmt.Println(f)
}

func main() {
    var i I

    i = &T{"Hello"}
    describe(i)
    i.M()

    i = F(math.Pi)
    describe(i)
    i.M()
}

func describe(i I) {
    fmt.Printf("(%v, %T)\n", i, i)
}

但是,上面的更改给了我相同的结果,因为它仍然是一个指针接收器。

(&{Hello}, *main.T)
Hello
(3.141592653589793, main.F)
3.141592653589793

我不确定我是否理解了这个概念。根据我的理解,由于接口变量我得到了一个指向 struct T 实例的指针,该接口变量的类型应该是指向 struct T 的指针,并且由于指向 struct T 的指针没有实现方法 M,它会导致恐慌。

4

2 回答 2

1

规格:方法集:

对应指针类型 *T的方法集是所有用receiver *Tor声明的方法的T集合(即它还包含 的方法集T)。

[...] 类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。

所以你用值接收者声明的所有方法也将属于相应指针类型的方法集,因此所有非指针类型实现的接口也将由指针类型实现(可能更多)。

于 2019-03-26T16:59:51.093 回答
0

Go 有一些捷径。例如:

a.Method()
a.Field

是相同的

(*a).Method()
(*a).Field

类似于这里的概念https://tour.golang.org/moretypes/4

于 2019-03-26T16:56:56.283 回答