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

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 1298|回复: 2

go语言interface接口继承多态示例及定义解析

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:12
  • 最近打卡:2024-08-20 04:02:52
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
28
主题
24
精华
0
金钱
103
积分
58
注册时间
2023-10-1
最后登录
2025-5-31

发表于 2024-6-6 14:58:37 | 显示全部楼层 |阅读模式
目录


  • 1.什么是接口
  • 2.接口定义
  • 3.多态

    • 多态加减计算器

  • 4.接口继承与转换
  • 5.空接口
  • 6.接口转换
  • 7.实现map字典接口
  • 8.interface案例

1.什么是接口

接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接。为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了。
在程序开发中,接口只是规定了要做哪些事情,干什么。具体怎么做,接口是不管的。这和生活中接口的案例也很相似,例如:USB接口,只是规定了标准,但是不关心具体鼠标与键盘是怎样按照标准生产的.
在企业开发中,如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口告诉开发人员你需要实现那些功能。

2.接口定义

接口定义的语法如下:
  1. 方式一:interface接收任意数据格式
  2. //先定义接口  一般以er结尾  根据接口实现功能
  3. type CurrencyEr2 interface{
  4.         Symbol() string
  5. }

  6. 方式二:指定类型
  7. type Currency string
复制代码
怎样具体实现接口中定义的方法呢?
  1. func (c Currency)Symbol() string {
  2.         m := ""
  3.         switch c {
  4.         case "CNY":
  5.                 // 人民币
  6.                 m = "¥"
  7.         case "KRW":
  8.                 // 韩币
  9.                 m = "₩"
  10.         case "TWD":
  11.                 // 台币
  12.                 m = "$"
  13.         case "JPY":
  14.                 // 日元
  15.                 m = "¥"
  16.         case "USD":
  17.                 // 美元
  18.                 m = "$"
  19.         }
  20.         return m
  21. }
复制代码
具体的调用如下:
  1. func main() {
  2.   // 方式一:
  3.   a:=CurrencyEr2(Currency("CNY")).Symbol()
  4.         fmt.Println(a)
  5.   // 方式二:
  6.         b:=Currency("CNY").Symbol()
  7.         fmt.Println(b)
  8. }
复制代码
只要类(结构体)实现对应的接口,那么根据该类创建的对象,可以赋值给对应的接口类型。
接口的命名习惯以er结尾。

3.多态

接口有什么好处呢?实现多态。
多态就是同一个接口,使用不同的实例而执行不同操作
所谓多态指的是多种表现形式,如下图所示:
使用接口实现多态的方式如下:
  1. package main
  2. import "fmt"
  3. //先定义接口  一般以er结尾  根据接口实现功能
  4. type CurrencyEr2 interface {
  5.         //方法  方法的声明
  6.         Symbol() string
  7. }
  8. type Currency string
  9. type Currency2 string
  10. func (c Currency) Symbol() string {
  11.         m := ""
  12.         switch c {
  13.         case "CNY":
  14.                 m = "¥"
  15.         }
  16.         return m
  17. }
  18. func (c Currency2) Symbol() string {
  19.         m := ""
  20.         switch c {
  21.         case "USD":
  22.                 m = "$"
  23.         }
  24.         return m
  25. }
  26. //多态的实现
  27. //将接口作为函数参数  实现多态
  28. func Start(c CurrencyEr2) string {
  29.         return c.Symbol()
  30. }
  31. func main() {
  32.         //调用多态函数
  33.         a := Start(Currency("CNY"))
  34.         fmt.Println(a)
  35.         //调用多态函数
  36.         b := Start(Currency2("USD"))
  37.         fmt.Println(b)
  38. }
复制代码
多态加减计算器
  1. package main
  2. import "fmt"
  3. //定义接口
  4. type Opter interface {
  5.         //方法声明
  6.         Result() int
  7. }
  8. //父类结构体
  9. type Operate struct {
  10.         num1 int
  11.         num2 int
  12. }
  13. //加法子类结构体
  14. type Add struct {
  15.         Operate
  16. }
  17. //实现加法子类的方法
  18. func (a *Add) Result() int {
  19.         return a.num1 + a.num2
  20. }
  21. //减法子类结构体
  22. type Sub struct {
  23.         Operate
  24. }
  25. //实现减法子类的方法
  26. func (s *Sub) Result() int {
  27.         return s.num1 - s.num2
  28. }
  29. //创建一个类负责对象创建
  30. //工厂类
  31. type Factory struct {
  32. }
  33. func (f *Factory) Result(num1 int, num2 int, ch string) int {
  34.         sum := 0
  35.         switch ch {
  36.         case "+":
  37.                 var a Add
  38.                 a.num1 = num1
  39.                 a.num2 = num2
  40.                 sum = Opter.Result(&a)
  41.         case "-":
  42.                 var s Sub
  43.                 s.num1 = num1
  44.                 s.num2 = num2
  45.                 sum = Opter.Result(&s)
  46.         }
  47.         return sum
  48. }
  49. //通过设计模式调用
  50. func main() {
  51.         //创建工厂对象
  52.         var f Factory
  53.         a:= f.Result(10, 20, "+")
  54.         fmt.Println(a)
  55. }
复制代码
4.接口继承与转换

接口也可以实现继承:
  1. package main
  2. import "fmt"
  3. //先定义接口  一般以er结尾  根据接口实现功能
  4. type Humaner2 interface {   //子集
  5.     //方法  方法的声明
  6.     sayhi()
  7. }
  8. type Personer interface {  //超集
  9.     Humaner2   //继承sayhi()

  10.     sing(string)
  11. }
  12. type student13 struct {
  13.     name  string
  14.     age   int
  15.     score int
  16. }
  17. func (s *student13)sayhi()  {
  18.     fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
  19. }
  20. func (s *student13)sing(name string)  {
  21.     fmt.Println("我为大家唱首歌",name)
  22. }
  23. func main() {
  24.     //接口类型变量定义
  25.     var h Humaner2
  26.     var stu student13 = student13{"小吴",18,59}
  27.     h = &stu
  28.     h.sayhi()
  29.     //接口类型变量定义
  30.     var p Personer
  31.     p = &stu
  32.     p.sayhi()
  33.     p.sing("大碗面")
  34. }
复制代码
接口继承后,可以实现“超集”接口转换“子集”接口,代码如下:
  1. package main
  2. import "fmt"
  3. //先定义接口  一般以er结尾  根据接口实现功能
  4. type Humaner2 interface {   //子集
  5.     //方法  方法的声明
  6.     sayhi()
  7. }
  8. type Personer interface {  //超集
  9.     Humaner2   //继承sayhi()
  10.     sing(string)
  11. }
  12. type student13 struct {
  13.     name  string
  14.     age   int
  15.     score int
  16. }
  17. func (s *student13)sayhi()  {
  18.     fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
  19. }
  20. func (s *student13)sing(name string)  {
  21.     fmt.Println("我为大家唱首歌",name)
  22. }
  23. func main()  {
  24.     //接口类型变量定义
  25.     var h Humaner2  //子集
  26.     var p Personer    //超集
  27.     var stu student13 = student13{"小吴",18,59}
  28.     p = &stu
  29.     //将一个接口赋值给另一个接口
  30.     //超集中包含所有子集的方法
  31.     h = p  //ok
  32.     h.sayhi()
  33.     //子集不包含超集
  34.     //不能将子集赋值给超集
  35.     //p = h  //err
  36.     //p.sayhi()
  37.     //p.sing("大碗面")
  38. }
复制代码
5.空接口

空接口(interface{})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值。
例如:
  1. var i interface{}
  2. //接口类型可以接收任意类型的数据
  3. //fmt.Println(i)
  4. fmt.Printf("%T\n",i)
  5. i = 10
  6. fmt.Println(i)
  7. fmt.Printf("%T\n",i)
复制代码
当函数可以接受任意的对象实例时,我们会将其声明为interface{},最典型的例子是标准库fmt中PrintXXX系列的函数,例如:
  1. func Printf(fmt string, args ...interface{})
  2. func Println(args ...interface{})
复制代码
如果自己定义函数,可以如下:
  1. func Test(arg ...interface{}) {
  2. }
复制代码
Test( )函数可以接收任意个数,任意类型的参数。

6.接口转换

结论:超集可以转换为子集,子集不可以转换为超集
  1. package main
  2. import "fmt"
  3. type Humaner interface { //子集
  4.         sayhi()
  5. }
  6. type Personer interface { //超集
  7.         Humaner //匿名字段,继承了sayhi()
  8.         sing(lrc string)
  9. }
  10. type Student struct {
  11.         name string
  12.         id   int
  13. }
  14. //Student实现了sayhi()
  15. func (tmp *Student) sayhi() {
  16.         fmt.Printf("Student[%s, %d] sayhi\n", tmp.name, tmp.id)
  17. }
  18. func (tmp *Student) sing(lrc string) {
  19.         fmt.Println("Student在唱着:", lrc)
  20. }
  21. func main() {
  22.         //超集可以转换为子集,反过来不可以
  23.         var iPro Personer //超集
  24.         iPro = &Student{"mike", 666}
  25.         var i Humaner //子集
  26.         //iPro = i //err
  27.         i = iPro //可以,超集可以转换为子集
  28.         i.sayhi()
  29. }
复制代码
7.实现map字典接口
  1. package main
  2. import (
  3.         "fmt"
  4.         "sync"
  5. )
  6. type UserAges struct {
  7.         ages map[string] int
  8.         sync.Mutex
  9. }
  10. func (u *UserAges)Add(name string,age int)  {
  11.         u.Lock()
  12.         defer u.Unlock()
  13.         u.ages[name] = age
  14. }
  15. func (u *UserAges)Get(name string)int{
  16.         if age,ok:=u.ages[name];ok{
  17.                 return age
  18.         }
  19.         return -1
  20. }
  21. func main() {
  22.         dic:=make(map[string]int)
  23.         dic["age"] = 18
  24.         r:=UserAges{ages: dic}
  25.         r.Add("jeff",20)
  26.         fmt.Println(r)
  27.         age:=r.Get("age")
  28.         fmt.Println(age)
  29. }
复制代码
8.interface案例
  1. package main
  2. import "fmt"
  3. type Bike interface {
  4.         save()
  5.         update()
  6.         insert()
  7. }
  8. type User struct {
  9.         name string
  10. }
  11. func (this *User) save() {
  12.         fmt.Println("保存成功", this.name)
  13. }
  14. func (this *User) update() {
  15.         fmt.Println("更新成功", this.name)
  16. }
  17. func (this *User) insert() {
  18.         fmt.Println("插入成功", this.name)
  19. }
  20. func main() {
  21.         var data Bike = &User{name: "jeff"}
  22.         data.save()
  23.         data.update()
  24.         data.insert()
  25. }
复制代码
以上就是go语言interface接口继承多态示例及定义解析的详细内容,更多关于go语言interface接口继承多态的资料请关注晓枫资讯其它相关文章!

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

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

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

发表于 2025-3-5 14:18:24 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

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

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

本版积分规则

1楼
2楼
3楼

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

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

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

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

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

Powered by Discuz! X3.5

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