美文网首页
go语言接口的定义和使用

go语言接口的定义和使用

作者: 太平小小草 | 来源:发表于2018-09-27 19:33 被阅读0次
    • 学习go语言有几个星期,发现学的东西一直停留在表面,有些东西做不到深层次的理解。知道可以这么用,但不知道为什么。目前暂时在博客上将一些与C++有差异的语法逻列出来,达到会记忆运用的目的。希望几个月后,我再回来看这些博客可以深入理解go语言的底层机制。
    package main
    import (
        "fmt"
    )
    
    type man interface{
        eat()
    }
    
    type liangchuan struct{
    }
    
    func (lia liangchuan) eat(){
        fmt.Println("liangchuan eat")
    }
    
    func startTest() {  
        var nnn liangchuan = liangchuan{}   
        var mm man
        mm = &nnn       //这地方使用mm=&nnn 和  mm=nnn都可以
        mm.eat()
      
    }
    
    func main(){
        startTest()
    }
    

    如上代码,当结构体实现接口man里的eat方法,如果方法的接收者类型是“值类型”,即上面所传的形参:lia liangchuan时,可得出结论:
    赋给接口变量mm值,即可以是liangchuan的变量,也可以是liangchuan的指针。
    而且go语言里结构体的指针,使用时不像C++里,需要使用->来调用成员,而是直接用.来调用成员。

    package main
    import (
        "fmt"
    )
    
    type man interface{
        eat()
        drink()
    }
    
    type liangchuan struct{
          mydrink string
          myeat   string
    }
    
    func (lia liangchuan) drink(){
        lia.mydrink = "changedrink"
    }
    
    func (lia *liangchuan) eat(){
        lia.myeat = "changeeat"
    }
    
    func startTest() {  
        var nnn liangchuan = liangchuan{"drink","eat"}   
        fmt.Println(nnn.mydrink)
        fmt.Println(nnn.myeat,"\n")
    
        var mm man
        mm = &nnn
        mm.eat()
        mm.drink()
    
        fmt.Println(nnn.mydrink)
        fmt.Println(nnn.myeat)
    }
    
    func main(){
        startTest()
    }
    

    如上代码,当方法的接收者,即有结构体类型,又有结构体指针类型时,赋给接口mm的,必须是结构体的指针。

    相关文章

      网友评论

          本文标题:go语言接口的定义和使用

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