1 接口的定义与理解
接口是一个自定义类型,它是一组方法的集合。从定义上来看,接口有两个特点。第一,接口本质是一种自定义类型,因此不要将golang中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。第二,接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。
接口是完全抽象的,因此不能将其实例化。然而,可以创建一个其类型为接口的变量,它可以被赋值为任何满足该接口类型的实际类型的值。接口的重要特性是:
(1)只要某个类型实现了接口要的方法,那么我们就说该类型实现了此接口。该类型的值可以赋给该接口的变量;
(2)作为1的推论,任何类型的值都可以赋值给空接口interface{}
注意:这只是golang中接口的特性,为非所有类型的特性(接口是一种特殊的类型)。
接口的特性是golang支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,golang提供了一种游离于类、继承、模板之外的更加灵活强大的选择。
2 例子
typeExchangerinterface{exchange()}typestringPairstruct{first,secondstring}typePoint[2]intfunc(sP*StringPair)exchange(){sp.first,sp.second=sp.second,sp.first}func(P*Point)exchange(){p[0],p[1]=p[1],p[0]}funcexchangeThese(exchangers...Exchanger){for_,exchanger:=rangeexchangers{exchanger.exchange()}}funcmain(){pair1:=StringPair{"abc","def"}pair2:=StringPair{"ghi","jkl"}point:=Point{5,7}fmt.Println(pair1,pair2,point)pair1.exchange()pair2.exchange()point.exchange()fmt.Println(pair1,point)//exchangeThese(pair1,pair2)//wrongexchangeThese(&pair1,&pair2)fmt.Println(pair1,pair2)}
运行结果
650) this.width=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="7.png" alt="wKioL1YfYriDNBSMAACXshVCpYE028.jpg" src="http://s3.51cto.com/wyfs02/M01/74/7F/wKioL1YfYriDNBSMAACXshVCpYE028.jpg">
在本例中,自定义类型StringPair和Point指针实现了接口Exchanger所需的方法,因此该类型的值可以被赋值给接口的值。
但是,特别注意一点。如果使用exchangeThese(pair1,pair2)会导致编译错误(如下图),正确写法应当是exchangeThese(&pair1,&pair2)。这是由于真正满足接口Exchanger的类型是StringPair指针,而非StringPair。
650) this.width=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="8.png" alt="wKiom1YfY62whJPlAAFdgv-1E-c818.jpg" src="http://s3.51cto.com/wyfs02/M00/74/83/wKiom1YfY62whJPlAAFdgv-1E-c818.jpg">
在golang中,值接收者和指针接收者的方法集是不同的。只是会智能地解引用和取引用,使得二者的方法集看上去是一样的。但是,在调用exchangeThese时,就凸显出二者的不同了。
总结以上是内存溢出为你收集整理的Golang中的接口与鸭子类型全部内容,希望文章能够帮你解决Golang中的接口与鸭子类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)