接口类型和值可以是不实现接口及其值的类型吗?

时间:2019-03-26 16:52:47

标签: go methods go-interface

以下是我正在查看的代码和说明的链接: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,因此会引起恐慌。

2 个答案:

答案 0 :(得分:1)

Spec: Method sets:

  

相应的pointer type *T的方法集是用接收者*TT声明的所有方法的集合(也就是说,它还包含T

     

[...]类型的方法集确定类型为implements的接口以及使用该类型的接收器可以为called的方法。

因此,您使用值接收器声明的所有方法也将属于相应指针类型的方法集,因此,非指针类型实现的所有接口也将由指针类型实现(可能还会更多)。 / p>

答案 1 :(得分:0)

Go有一些快捷方式。例如:

a.Method()
a.Field

相同
(*a).Method()
(*a).Field

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