Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 接口类型和值是否可以是不实现接口及其值的类型?_Go_Methods_Go Interface - Fatal编程技术网

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

Go 接口类型和值是否可以是不实现接口及其值的类型?,go,methods,go-interface,Go,Methods,Go Interface,以下是我正在查看的代码和说明的链接: 我将*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.Print

以下是我正在查看的代码和说明的链接:

我将*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,它将导致死机。

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

a.Method()
a.Field

(*a).Method()
(*a).Field
与此处的概念类似

相应的
*T
的方法集是与接收方
*T
T
声明的所有方法集(也就是说,它还包含
T
的方法集)

[…]类型的方法集决定了该类型的接口以及可以使用该类型接收器的方法

因此,使用value receiver声明的所有方法也将属于相应指针类型的方法集,因此非指针类型实现的所有接口也将由指针类型实现(可能更多)