go语言接口的定义和使用

2018-09-27  本文已影响0人  太平小小草
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的,必须是结构体的指针。

上一篇 下一篇

猜你喜欢

热点阅读