接口,姑且就称之为定义了一系列(也可能是空的)方法,但是又没有实现这些方法的一种结构体。
有时候,在纠结,接口类型的变量,到底是什么类型了?带着这个问题,来实 *** 一下。
首先定义两个个接口:
type YourType interface { SayHi(str string)}type HeType interface { SayHi(str string) SayBye(str string)}
上边是两个接口,YourYype接口中定义了一个SayHi方法。HeType定义了SayHi方法与SayBye方法。
下边再来定义一个类实现YourType接口。
type youkNow struct {}func (t youkNow) SayHi(str string) { fmt.Println("hi " + str)}
上边的youkNow就实现了YourType方法。
接着再来定义一个类,实现HeType接口,HeType接口中的SayHi方法与YourType接口中的SayHi方法一样,也就是说youkNow实现了HeType接口的SayHi方法,但是没有实现SayBye方法,那么接下来用过匿名组合的方式,实现SayBye接口,代码如下:
type dkNow struct { youkNow}func (t *dkNow) SayBye(str string) { fmt.Println("bye bye " + str + ".see you tomorrow.")}
通过匿名组合,上边的dkNow就实现了HeType接口,匿名组合,是不是很好用,赞一个。
下边来通过代码演示结果。
func main() { var myoukNow YourType = youkNow{} myoukNow.SayHi("demo") var mdkNow HeType = new(dkNow) mdkNow.SayBye("demo")}
上边先定义了一个接口类型的变量myoukNow,赋值时,使用的youkNow的结构体类型。
在定义HeType接口类型的变量mdkNow时,采用的是指针类型的dkNow
为什么会出现两种不同的情况了,也就是说接口既可以是struct,又可以是Ptr,那么怎么去判断,什么时候该给struct类型,什么时候又改给Ptr类型了。
原则:
1. 看实现接口的类,在实现接口方法时,指向的是指针,还是非指针。youkNow类在实现接口YourType时,他的方法SayHi是指向非指针的(专业术语不太会,姑且就这么描述了,不标准的地方请谅解,词可达意,无碍传播知识的要求写的文章,下同)。所以将youkNow类实例化赋值给接口时,需要采用struct类型。
2. dkNow类在实现HeType接口时,将SayBye方法指向了指针类型,所以在实例化dkNow类赋值给接口时,需要使用Ptr类型赋值给接口变量。
3. dkNow组合的youkNow实现了SayHi方法,指向了Struct类型,自己实现的SayBye,又指向了Ptr,这种情况怎么算?答案是,SayHi指向的非指针对象,golang会自动生成一个指向指针的SayHi方法,那么dkNow不就有指向指针的SayHi域SayBye两个方法了嘛,所以dkNow就实现了HeType接口了。
4. 那将dkNow类中的SayBye方法不指向指针,将youkNow类中的SayHi指向指针,还能这样赋值吗?答案是,YourType接口类型的变量需要用Ptr赋值,HeType接口类型的变量,也需要用Ptr赋值。也就是说指向Struct的方法,会自动生成指向Ptr的方法,反之,不会。
package mainimport "fmt"type YourType interface { SayHi(str string)}type HeType interface { SayHi(str string) SayBye(str string)}type youkNow struct {}type dkNow struct { youkNow}func (t youkNow) SayHi(str string) { fmt.Println("hi " + str)}func (t *dkNow) SayBye(str string) { fmt.Println("bye bye " + str + ".see you tomorrow.")}func main() { var myoukNow YourType = youkNow{} myoukNow.SayHi("demo") var mdkNow HeType = new(dkNow) mdkNow.SayBye("demo") mdkNow.SayHi("he type")}总结
以上是内存溢出为你收集整理的golang接口赋值 *** 练全部内容,希望文章能够帮你解决golang接口赋值 *** 练所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)