Go语言的接口

Go语言的接口,第1张

概述Golang的接口定义十分灵活,使用也很方便,可以很轻松的编码而不必考虑各种兼容性和外部藕合,因为只要我们实现了某个接口中定义的那个方法,也就是说方法签名一致,那么就可以认为实现了这个接口的方法,这个时候只要我们对方法的Receiver做一致性处理就好了,也就是面向同一个接口的多个方法的Receiver是一致的,那么它们就组成一个整体,是这个struct的一组行为的实现,OOP就自然而然的形成了,

Golang的接口定义十分灵活,使用也很方便,可以很轻松的编码而不必考虑各种兼容性和外部藕合,因为只要我们实现了某个接口中定义的那个方法,也就是说方法签名一致,那么就可以认为实现了这个接口的方法,这个时候只要我们对方法的Receiver做一致性处理就好了,也就是面向同一个接口的多个方法的Receiver是一致的,那么它们就组成一个整体,是这个struct的一组行为的实现,OOP就自然而然的形成了,这种简易的方法理解起来很容易。

好了,废话不多,直接上代码,里面写了注释,一看就清楚了。

package mainimport (	"fmt"	"math/rand"	"time")//////////////////////////////////////////////////// 定义一个通过USB硬件连接硬件的标准,也就是是OOP中的接口type IUsb interface {	Devicename() string // 通过此USB连接的设备的名称	UsbConnector        // 通过此USB的连接是如何实现的}// USB连接器,如果要通过USB向硬件连接,就应当实现此OOP中的接口中定义的方法type UsbConnector interface {	Connect()}//////////////////////////////////////////////////// 这是苹果手机连接器type ApplePhoneConnector struct {	name string}// 苹果手机需要实现Devicename()接口方法,以告诉连接器自己是谁,连接者也需要检查判断连接自己的设备是谁func (this *ApplePhoneConnector) Devicename() string {	return this.name}// 这里明确苹果手机是如何连接的,这是实现方法,我们假定它用了n秒才连接成功func (this *ApplePhoneConnector) Connect() {	fmt.Printf("Apple phone device %v connected cost %v milliseconds\n",this.name,rand.Intn(1000))}//////////////////////////////////////////////////// 这是苹果电视连接器type AppleTvConnector struct {	name string}// 苹果手机需要实现Devicename()接口方法,以告诉连接器自己是谁,连接者也需要检查判断连接自己的设备是谁func (this *AppleTvConnector) Devicename() string {	return this.name}// 这里明确苹果电视是如何连接的,这是实现方法,我们假定它用了n秒才连接成功func (this *AppleTvConnector) Connect() {	fmt.Printf("Apple TV device %v connected cost %v milliseconds\n",rand.Intn(1000))}//////////////////////////////////////////////////func main() {	fmt.Println("Ready...GO!")	rand.Seed(int64(time.Now().Nanosecond()))	// 创建指针引用,以避免struct的值传递,以提高效率	iPhone := &ApplePhoneConnector{name: "\"liwei de iPhone\""}	iPhone.Connect()	defer disconnect(iPhone)	apppleTv := &AppleTvConnector{name: "\"liwei de AppleTV\""}	apppleTv.Connect()	defer disconnect(apppleTv)	fmt.Println("All devices are sleep")}func disconnect(usb IUsb) {	// 判断是什么设备要断开连接	// 因为Devicename()和Connect()的Receiver都是指针类型,所以这里的类型名前要加星号,检查它是否是指向特定类型的指针	if _,ok := usb.(*ApplePhoneConnector); ok {		fmt.Printf("Apple Phone Device %v disconnected.\n",usb.Devicename())	} else if _,ok := usb.(*AppleTvConnector); ok {		fmt.Printf("Apple TV Device %v disconnected.\n",usb.Devicename())	} else {		fmt.Println("UnkNow device")	}}


下面是运行结果,简单吧:

我们可以看出,这个过程真正实现了一个接口对多个struct的约束和定义,它们的实现是不同的,运行多次,每次的Connector的结果都不相同。

总结

以上是内存溢出为你收集整理的Go语言的接口全部内容,希望文章能够帮你解决Go语言的接口所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1282778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存