0

0

Go接口interface的用法介绍

尚

发布时间:2020-02-17 17:17:55

|

3021人浏览过

|

来源于csdn

转载

go 的接口在go的编程里面用的十分频繁,尤其是空接口的使用,因为有了接口,才使得go语言变得异常的强大。 go语言教程栏目就来为大家介绍一下go接口interface的用法。

  Go接口interface的用法介绍

关于接口的概念:

1.接口是一个或多个方法签名的集合

2.只要某个类型拥有该接口的所有方法签名,就算实现了该接口,无需显示声明实现了哪个接口,这称之为 Structural Typing

3.接口只有方法声明,没有实现,没有数据结构字段

4.接口可以匿名嵌入其他接口,或者嵌入到接口中

5.将对象复制给接口,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针

6.接口调用不会做receiver的自动转换

7.接口也可以实现类似OOP中的多态

8.空接口可以作为任何类型数据的容器

现在开始介绍一下最基础的interface。 介绍一下概念2

package main
 
import (
	"fmt"
)
type USB interface {   // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名,
	Name() string       //即就实现了PhoneConnect的接口,无需在声明。这就是上面说的第2条
	Connect()
}
type PhoneConnect struct {   //定义的结构体
	name string
}
func (pc PhoneConnect) Name() string{  //上面结构体的方法
	return pc.name
}
func (pc PhoneConnect) Connect(){
	fmt.Println("Connectd to: ",pc.name)
}
 
func main(){    
	var a USB      //声明该接口
	a = PhoneConnect{"IPhone"}  //该接口已经支持PhoneConnect这个结构体了。初始化该结构体
	a.Connect()     //调用该结构体的Connect方法
}

如果上面的例子看明白了的话接着往下看。

再定义一个函数,接收参数为USB类型。把a传进去,其实a已经可以调用phoneConnect的所有方法了。而且这时,我把a的声明弄得含糊点。

支付宝账户登录ecshop插件
支付宝账户登录ecshop插件

支付宝账户登录ecshop插件简介: 先向支付宝申请支付接口,拿到合作身份者ID和安全检验码这两个东西。 把login整个文件夹传到服务器上ecshop安装所在的目录,如果路径不对可以会导致使用失败。 需要修改的文件:alipay_config.php return_url.php可以修改第30行的邮箱域名为你的网站域名。 别的不用改,否则会导致无法使用。

下载
func Disconnect(usb USB){
	fmt.Println("Discounnectd from:",usb.Name())
}
func main(){
	a := PhoneConnect{"IPhone"}  //a是什么类型呢?
	fmt.Println("type:",reflect.TypeOf(a))
	Disconnect(a)
}

看看运行结果:

type: main.PhoneConnectDiscounnectd from: IPhone

a是一个被实例化的PhoneConnect类型的结构体,但Disconnect函数要求接收一个USB类型的数据,a竟然可以传递进来!!!

再来看看概念7:

type USB interface {   // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名,
	Name() string       //
	Connect             //嵌入了一个Connect接口,效果和最开始演示的是一样的
}
type Connect interface {
	Connect()
}

那任何结构体满足拥有Name()和Connect()方法就可以看作是一个USB。是不是有些不妥,DisConnect()函数万一我传递进去的USB不是手机呢??这就用个ok-pattern就可以了。比如,我再加一个电视这个结构体,电视也有usb接口。

type TVConnect struct {
	name string
}
func (tc TVConnect) Name() string{
	return tc.name
}
func (tc TVConnect) Connect() {
	fmt.Println("Connect to: ",tc.name)
}
func Disconnect(usb USB){
	if rs,ok := usb.(PhoneConnect);ok{
		fmt.Println("Disconnect: ",rs.name)
	}else{
		fmt.Println("Unknown device: ")
	}
}
func main(){
	a := PhoneConnect{"IPhone"}
	b := TVConnect{"ChuangWei"}
	Disconnect(a)
	Disconnect(b)
}

看看打印结果:

Disconnect:  IPhone
Unknown device: 

b是一个创维电视的usb接口,但是b在Disconnect函数里没有被识别,因为他是一个TV。

再次进阶。那既然可以在Disconnect函数里面再判断传进来的数据的结构,那么就不用再管USB接口类型了吧。直接定义成空接口。不就就完了,反正我是在函数里面判断你是什么类型呢。

func Disconnect(usb interface{}){   //注意,这里是空接口
	switch v:=usb.(type) {
	case PhoneConnect:
		fmt.Println(" Phone device Disconnected from",v.name)
	case TVConnect:
		fmt.Println("TV device Disconnected from",v.name)
	default:
		fmt.Println("Unknown device ...")
	}
}
func main(){
	a := PhoneConnect{"IPhone"}
	b := TVConnect{"ChuangWei"}
	Disconnect(a)
	Disconnect(b)
}

看看打印情况:

Phone device : Disconnected from IPhone
TV device : Disconnected from ChuangWei

更多go语言知识请关注php中文网go语言教程栏目。

相关专题

更多
PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

13

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

93

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

112

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

155

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号