go中的接口与多态

简介: go中的接口与多态

小熊不小心把自己的电脑刷成砖了。哭了。。

image.png



本来想格式化下盘,谁知道格式化完以后啥都没有,连系统都没了,几乎和 rm -rf / 有得一拼!


image.png


按官网给的方法试了,启动 u 盘制作不成功,制作成功了识别不出来,尝试网络恢复发现只能连美国的服务器,好不容易连上了,等了两个小时结果无法验证 OS !

网络异常,图片无法展示
|

搞了两天到现在都没搞定,只能等明天再背去公司试试了。

今天和大家聊聊 golang 的接口( interface


接口


接口同 java 一样,可以把一堆有共性的方法定义在里面,但是比 java 灵活的是,不需要显式实现接口,你可以自己控制实现哪些方法。


不需要显式实现的意思是,不需要像 java 那样 implements interface 写出来,别急,看完下面的例子就知道了。


定义一个接口。

type humanInterface interface {
  eat() string
  play() string
}

定义一个结构体(类)


type man struct {
  name string
}


实现接口,语法和 给结构体添加方法 一样,完全看不出来 接口 的身影。

func (p man) eat() string {
  return "eat banana"
}
func (p man) play() string {
  return "play game"
}

上面的代码给结构体添加了和接口一样的方法,只要完全实现接口中的方式,默认这就实现接口(隐式)。


用下面这样的格式,把结构体赋值给接口来实现他

接口实例 = new(类型)

var human humanInterface
human = new(man)
fmt.Println(human.eat())
fmt.Println(human.play())

输出


eat banana
play game


PS: new 关键字和 c++ 中的不同,释放内存由 go 的垃圾处理机来做,不需要自己释放内存。


这不是接口


上面的是一个很简单实现接口的例子。

要注意的是,必须实现了所有接口的方法才算是实现了这个接口。

假如我们只实现了接口中的一个方法,会发生什么事?


type dogInterface interface {
  eat() string
  play() string
}
type dog1 struct {
  name string
}
func (d dog1) eat() string {
  return "Eat dog food"
}
var dog dogInterface
dog = new(dog1)


报错

报错:Cannot use 'new(dog1)' (type *dog1) as type dogInterface in assignment
Type does not implement 'dogInterface' as some methods are missing: play() string more...

多态


当然,多态是面向对象的灵魂, go 怎么能没有?

这是一个以接口为参数的函数,方法内调用了接口中方法。


func humanDoWhat(p humanInterface) {
  fmt.Println(p.eat())
  fmt.Println(p.play())
}

传入不同的类(结构体)


w := woman{"lisa"}
m := man{"coding3min"}
// 多态的含义就是不需要修改函数,只需要修改外部实现
// 同一个接口有不同的表现
humanDoWhat(w)
humanDoWhat(m)


不同输出

lisaeat rice
lisawatch TV
coding3mineat banana
coding3minplay game


java 中的多态有三个必要条件


  • 继承
  • 重写
  • 父类引用指向子类对象


但是 go 没有继承、重写, go 作为一种优雅的语言, 给我们提供了这种解决方案,那就是鸭子类型:看起来 像鸭子, 那么它就是 鸭子


周末愉快~ 希望我的电脑我能自己弄好

相关文章
|
5月前
|
存储 Go
Go语言之接口与多态 -《Go语言实战指南》
Go 语言中的接口是实现多态的核心机制,通过一组方法签名定义行为。任何类型只要实现接口的所有方法即视为实现该接口,无需显式声明。本文从接口定义、使用、底层机制、组合、动态行为到工厂模式全面解析其特性与应用,帮助理解 Go 的面向接口编程思想及注意事项(如 `nil` 陷阱)。
172 22
|
20天前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
86 3
|
5月前
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
132 15
|
5月前
|
Go
Go语言接口的定义与实现
Go 语言的接口提供了一种灵活的多态机制,支持隐式实现和抽象编程。本文介绍了接口的基本定义、实现方式、空接口的使用、类型断言以及接口组合等核心概念,并探讨了接口与 nil 的关系及应用场景。通过示例代码详细说明了如何利用接口提升代码的可扩展性和可测试性,总结了接口的关键特性及其在依赖注入、规范定义和多态调用中的重要作用。
222 14
|
10月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
11月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
238 1
Go nil 空结构体 空接口有什么区别?
|
存储 Go
Go to Learn Go之接口
Go to Learn Go之接口
111 7
|
XML 存储 JSON
在Go中使用接口:实用性与脆弱性的平衡
在Go中使用接口:实用性与脆弱性的平衡
|
存储 安全 程序员
|
存储 设计模式 Go
深入理解Go语言的接口
【8月更文挑战第31天】
157 0

热门文章

最新文章