Go语言 Interface(接口)

server/2024/9/22 23:48:13/

基本介绍

  1. Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
  2. 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
  3. Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。
  4. 一个类型可以实现多个接口,一个接口也可以被多个类型实现。

基本使用

	type Animal interface {Run()Say()}type Horse struct {Name string}type Dog struct {Name string}func (h *Horse) Run(){fmt.Println("Horse Run")}func (h *Horse) Say(){fmt.Println("Horse Say")}func (d *Dog) Run(){fmt.Println("Dog Run")}func (d *Dog) Say(){fmt.Println("Dog Say")}func animalAction(animal Animal){animal.Run()animal.Say()}func main(){horse := &Horse{"Horse",}dog := &Dog{"dog",}fish := &Fish{"fish",}animalAction(horse) // Horse Run Horse SayanimalAction(dog)// Dog Run Dog Say}

代码解释

  1. 我们先定义了一个动物的接口,接口有两个方法签名
  2. 定义了马的结构体,并实现了接口的两个方法,所以这个马的结构体实现了动物接口
  3. 定义了狗的结构体,并实现了接口的两个方法,所以这个狗的结构体实现了动物接口
  4. 定义一个 animalAction 函数,参数是 接口类型,意味着只要实现了该接口的类型都可以传
  5. 在 main 函数中,分别实例化了一个马和一个狗并传入 animalAction ,从而实现了多态

空接口 interface{}

  1. 空接口是指没有定义任何方法的接口。
  2. 因此任何类型都实现了空接口。
  3. 空接口类型的变量可以存储任意类型的变量。
  4. 使用空接口实现可以接收任意类型的函数参数。
  5. 把一个空接口类型的值赋值给一个类型需要通过断言。

类型断言

我们可以通过变量后面 . (类型)的语法对变量进行断言

	func demo1(){var i interface{}var str stringi = "adf"str = i.(string)fmt.Print(str) // abc}
	func demo2(){var i interface{}var number inti = 123number = i.(int)fmt.Print(number) // 123}

函数传参

  1. 可以把接口类型的数据传入到函数里。
  2. 想知道断言是否成功可以通过接口第二个参数。
	func demo3(i interface{}){value1 ,ok1 := i.(string)if ok1 {fmt.Printf("i is string,value:%s\n",value1)}value2 ,ok2 := i.(int)if ok2 {fmt.Printf("i is int,value:%d\n",value2)}}func main(){demo3(1) // i is int,value:1demo3("abc") // i is string,value:abc}

switch 判断类型

如果觉得上面那种 if 判断多个类型的时候很麻烦,我们可以使用 switch i.(type) 语法来判断多个类型。

	func demo4(i interface{}){switch i.(type) {case int:fmt.Println("is int")case string:fmt.Println("is string")case bool:fmt.Println("is bool")}}func main(){demo4(1)//is intdemo4("abc")// is stringdemo4(true)//is bool}

http://www.ppmy.cn/server/20763.html

相关文章

机器人-轨迹规划

旋转矩阵 旋转矩阵--R--一个3*3的矩阵,其每列的值时B坐标系在A坐标系上的投影值。 代表B坐标系相对于A坐标系的姿态。 旋转矩阵的转置矩阵 其实A相对于B的旋转矩阵就相当于把B的列放到行上就行。 视频 (将矩阵的行列互换得到的新矩阵称为转置矩阵。&…

推荐3个视频转文字的工具

如果是长视频转文字的话,我会推荐你三个专业的能够将视频文字提取出来的工具,操作无门槛,转换出的文字准确率高,可以直接导出文字。 1.一键识别王 https://www.xunjiepdf.com/yijianshibiewang 专业的图片文字识别软件&#xff0…

后端端口也可以直接在浏览器访问

比如在浏览器输入http://localhost:8078/hello/helloword访问的是后端的 RestController RequestMapping("/hello") public class HelloWord {RequestMapping("/helloword")public String helloWord(){return "hello word";} }浏览器将会返回

剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 …

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径: D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接:https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Android 开发工具使用

c调试 在NDK调试的时候,如果找不到 符号的话,我们可以在调试配置中添加符号地址的全路径一直到根目录:,xxx/armeabi-v7a: You must point the symbol search paths at the obj/local/ directory. This is also not a …

redission原理笔记

加锁成功的线程,将UUID和线程id和key绑定, 加锁成功后,内部有一个看门狗机制,每隔十秒看下当前线程是否还持有锁,延长生存时间。 没有获取锁的就一直自旋等待,直到超时。 如果redis是主从同步的&#xff0…

HarmonyOS开发案例:【购物APP】

介绍 本篇Codelab使用常用组件、页面路由router实现购物应用,包含以下功能: 使用toolbar、toolbar-item组件实现“首页”,“新品”,“购物车”,“我的”页面切换。使用list组件,展示购物车里的商品。使用…