美文网首页golang 编程笔记
【golang】interface中接收方法你不知道的秘密

【golang】interface中接收方法你不知道的秘密

作者: dongzd | 来源:发表于2020-04-25 10:36 被阅读0次

首先,在结构体中的值接受方法与指针接受方法,对于值类型或者指针类型的结构体实例都可以调用,如下:

type Gopher struct {
    language string
}

func (g *Gopher) Str() string {
    return fmt.Sprintf("我是指针接受方法:%s", g.language)
}

func (g Gopher) Tye() string {
    return fmt.Sprintf("我是值接受方法:%s", g.language)
}

func main() {

    var a = Gopher{language: "golang"}
    fmt.Println(a.Str())
    fmt.Println(a.Tye())

    var b = &Gopher{language: "python"}
    fmt.Println(b.Str())
    fmt.Println(b.Tye())
}

上述申明了一个值类型实例a与指针类型实例b,去调用接受方法,都能正常输出,这是起到了语法糖作用,编译器会自动适应。

我是指针接受方法:golang
我是值接受方法:golang
我是指针接受方法:python
我是值接受方法:python

万事都有个但是,如果我们去用结构体实现接口里面的方法,是否也可以直接实现一个值类型接受方法与一个指针类型接方法,就如下面:

type Coder interface {
    Str() string
    Tye() string
}
type Gopher struct {
    language string
}

func (g *Gopher) Str() string {
    return fmt.Sprintf("我是指针接受方法:%s", g.language)
}

func (g Gopher) Tye() string {
    return fmt.Sprintf("我是值接受方法:%s", g.language)
}

func main() {
    var a Coder = Gopher{language: "golang"}
    fmt.Println(a.Str())
    fmt.Println(a.Tye())
}

上述实现结构方法,一个方法用指针类型实现,一个方法用指针类型方法。申明一个值类型的接口实例去调用:

./ticker.go:28:6: cannot use Gopher literal (type Gopher) as type Coder in assignment:
        Gopher does not implement Coder (Str method has pointer receiver)

而如果申明一个指针类型的接口实例去调用:

func main() {
    var b Coder = &Gopher{language: "golang"}
    fmt.Println(b.Str())
    fmt.Println(b.Tye())
}
我是指针接受方法:golang
我是值接受方法:golang

小朋友你是否有很多问好????

这里就引出一个go语言的语法糖:

如果实现了接受者是值类型的方法,会隐含的实现接受者是指针类型的方法。接受者是指针类型的方法,不能隐含实现接受者是值类型的方法。

所以上述中申明一个指针类型的接口实例b,其type()的值类型接受方法会隐含实现指针类型。
而声明一个值类型的接口实例a,str()的指针接受方法,不能自动隐含值类型接受方法,所以导致声明的值类型接口实例不能满足接口的实现条件。

相关文章

网友评论

    本文标题:【golang】interface中接收方法你不知道的秘密

    本文链接:https://www.haomeiwen.com/subject/lijhwhtx.html