美文网首页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