- 学习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的,必须是结构体的指针。
网友评论