设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 希望你一辈子都是小孩儿 对所有事都好奇 爱哼小曲 永远快乐 喜欢和讨厌不用遮掩 每天都能跟喜欢的人讲一大堆废话 也能互道晚安❤️

希望你一辈子都是小孩儿 对所有事都好奇 爱哼小曲 永远快乐 喜欢和讨厌不用遮掩 每天都能跟喜欢的人讲一大堆废话 也能互道晚安❤️ -- 晚安

查看: 894|回复: 3

golang基础之Interface接口的使用

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:227
  • 打卡月天数:0
  • 打卡总奖励:3338
  • 最近打卡:2025-04-20 15:33:21
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
415
主题
378
精华
0
金钱
4567
积分
846
注册时间
2023-1-3
最后登录
2025-4-20

发表于 2023-8-8 13:06:47 来自手机 | 显示全部楼层 |阅读模式
接口是一个或多个方法签名名的集合,定义方式如下
  1. type Interface_Name interface { method_a() string method_b() int .... }
复制代码
只要某个类型拥有该接口的所有方法签名,就算实现该接口,无需显示声明实现了那个接口,这称为structural Typing
  1. package main
  2. import "fmt"

  3. type USB interface { //定义一个接口:方法的集合
  4.   Name() string //Name方法,返回string
  5.   Connect()   //Connect方法
  6. }

  7. type PhoneConnecter struct { //定义一个结构
  8.   name string //结构包含一个字段
  9. }

  10. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
  11.   return pc.name //该方法命名为接口内的字段
  12. } //返回结构体字段

  13. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
  14.   fmt.Println("Connect:", pc.name)
  15. }
  16. func main() {
  17.   var a USB              //定义一个变量为USB接口类型
  18.   a = PhoneConnecter{"PhoneConnecter"} //实例化一个结构体,并赋值给变量(接口)USB
  19.   a.Connect()             //接口调用其Connect方法,也是结构方法
  20. }

  21. /*输出
  22. Connect: PhoneConnecter
  23. */
复制代码
接口可以作为匿名嵌入其它接口,或嵌入到结构中
  1. package main
  2. import "fmt"

  3. type USB interface { //定义一个接口:方法的集合
  4.   Name() string //Name方法,返回string
  5.   Connecter   //嵌入Connecter接口,可以使用Connecter方法
  6. }

  7. type Connecter interface { //定义另一个接口 Connecter
  8.   Connect() //包含一个接口方法:Connect
  9. }
  10. type PhoneConnecter struct { //定义一个结构
  11.   name string //结构包含一个字段
  12. }

  13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
  14.   return pc.name //该方法命名为接口内的字段
  15. } //返回结构体字段

  16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
  17.   fmt.Println("Connect:", pc.name)
  18. }
  19. func main() {
  20.   var a USB              //定义一个变量为USB接口类型
  21.   a = PhoneConnecter{"PhoneConnecter"} //实例化一个结构体,并赋值给变量(接口)USB
  22.   a.Connect()
  23.   Disconnect(a) //接口调用其Connect方法,也是结构方法
  24. }
复制代码
接口只是方法声明,没有实现调用,没有字段,只能通过绑定的类型方法访问
  1. package main
  2. import "fmt"

  3. type USB interface { //定义一个接口:方法的集合
  4.   Name() string //Name方法,返回string
  5.   Connecter   //嵌入Connecter接口,可以使用Connecter方法
  6. }

  7. type Connecter interface { //定义另一个接口 Connecter
  8.   Connect() //包含一个接口方法:Connect
  9. }
  10. type PhoneConnecter struct { //定义一个结构
  11.   name string //结构包含一个字段
  12. }

  13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
  14.   return pc.name //该方法命名为接口内的字段
  15. } //返回结构体字段

  16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
  17.   fmt.Println("Connected:", pc.name)
  18. }
  19. func main() {
  20.   var a USB           //定义一个变量为USB接口类型
  21.   a = PhoneConnecter{"htc M10"} //实例化一个结构体,并赋值给变量(接口)USB
  22.   a.Connect()
  23.   Disconnect(a) //接口调用其Connect方法,也是结构方法
  24. }

  25. func Disconnect(usb USB) {
  26.   if pc, ok := usb.(PhoneConnecter); ok { //传入结构体,判断赋值是否成功
  27.     fmt.Println("Disconnected:", pc.name)
  28.     return
  29.   }
  30.   fmt.Println("UNknown device.")
  31. }

  32. /*输出
  33. Connect: htc M10
  34. Disconnect:htc M10
  35. */
复制代码
go没有像其他语言继承,如python中的object表示元类,所有的类都继承自object类,go通过接口也类似实现了此定义,因为只要某个类型实现了某个接口的方法,我们就说此类实现了这个接口。 因为 type empty interface{} ---空接口没有任何方法,所以可以理解为所有的接口都实现了空接口的方法(继承)。
  1. package main
  2. import "fmt"

  3. type USB interface { //定义一个接口:方法的集合
  4.   Name() string //Name方法,返回string
  5.   Connecter   //嵌入Connecter接口,可以使用Connecter方法
  6. }

  7. type Connecter interface { //定义另一个接口 Connecter
  8.   Connect() //包含一个接口方法:Connect
  9. }
  10. type PhoneConnecter struct { //定义一个结构
  11.   name string //结构包含一个字段
  12. }

  13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
  14.   return pc.name //该方法命名为接口内的字段
  15. } //返回结构体字段

  16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
  17.   fmt.Println("Connected:", pc.name)
  18. }
  19. func main() {
  20.   var a USB           //定义一个变量为USB接口类型
  21.   a = PhoneConnecter{"htc M10"} //实例化一个结构体,并赋值给变量(接口)USB
  22.   a.Connect()
  23.   Disconnect(a) //接口调用其Connect方法,也是结构方法
  24. }

  25. # func Disconnect(usb interface{}) { //集成空接口,也可以实现
  26. #  if pc, ok := usb.(PhoneConnecter); ok { //传入结构体,判断赋值是否成功
  27. #    fmt.Println("Disconnected:", pc.name)
  28. #    return
  29. #  }
  30. #  fmt.Println("UNknown device.")
  31. #  }

  32. //通过switch判断接口类型:type...switch用法
  33. func Disconnect(usb interface{}) { //集成空接口,也可以实现
  34. switch v := usb.(type) {
  35. case PhoneConnecter:
  36.   fmt.Println("Disconnected:", v.name)
  37. default:
  38.   fmt.Println("UNknown device.")
  39. }
  40. }

  41. /*输出
  42. Connect: htc M10
  43. Disconnect:htc M10
  44. */
复制代码
接口间的转换: 只有子类接口可以转换为父类接口,因为父类接口包含了子类接口,子类接口可以调用父类接口一部分接口方法
将对象赋值给接口是,会发生拷贝,而接口内部存储的是只想这个复制品的指针,也就意味着接口无法修改状态,也无法获取指针。
  1. ...
  2. func main() {
  3. pc := PhoneConnecter{"ipad book pro"} //实例化一个结构
  4. var a Connecter            //定义a为接口变量
  5. a = Connecter(pc)           //接口强制转换
  6. a.Connect()

  7. pc.name = "Iphone 7"
  8. a.Connect()
  9. ...

  10. /*输出
  11. pc.name= "ipad book pro"  Connected: ipad book pro
  12. pc.name = "Iphone 7"    Connected: ipad book pro
  13. */
  14. }
复制代码
只有当 接口存储的类型和对象都为nil时,接口才等于nil
  1. package main
  2. import "fmt"

  3. func main() {
  4.   var a interface{}
  5.   fmt.Println(a == nil)

  6.   var p *int = nil
  7.   a = p
  8.   fmt.Println(a == nil)
  9. }

  10. /*输出
  11. true
  12. false
  13. */
复制代码
      
  • 接口调用不会做Receiver的自动转换  
  • 接口同样支持匿名字段的方法  
  • 接口也可以实现类似OOP(面向对象编程)中的多态  
  • 空接口可以作为任何类型数据的容器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2023-8-11 07:53:31 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2024-5-11
最后登录
2024-5-11

发表于 2024-10-18 15:06:11 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2025-4-9 05:16:59 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表