Go语言 Interface(接口)

ops/2024/9/22 23:48:04/

基本介绍

  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/ops/18620.html

相关文章

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务(之前是Ribbon——RestTemplate) 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

C# WinForm —— 09 标签、文本框、按钮控件

标签 Label 一般显示不能编辑的文本或图像 常用属性、事件: 属性用途(Name)标签对象的ID,在代码里引用标签的时候会用到,一般以 lbl 开头Text设置或获取 界面上显示的 文本信息Image显示图像ImageList图像集,通常和 ListView ToolStrip Tre…

ITMS-90426: Invalid Swift Support

原文 Please correct the following issues and upload a new binary to App Store Connect. ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. 解决方式 ITMS-…

git提交常用

git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱" 第一次上传到码云 1.找到要提交到码云的文件夹 右击打开Git Bash Here 2.用命令行创建本地仓库 git init 3.将待全部文件放入缓冲区 git add . 4.提交缓…

华为 obs相关

obd配置 hw-obs:endpoint: ak: sk: bucketname:获取桶列表 public class HwObsController {Value("${hw-obs.ak}")private String hwObsAk;Value("${hw-obs.sk}")private String hwObsSk;Value("${hw-obs.endPoint}")private String hwObsEndp…

音频播放录音回声消除

完整示例代码 https://gitee.com/daizhufei/record-demo-with-noise 录音 class AudioRecorder {private var record falseprivate fun printLog(message: String) Log.i(AudioRecorder::class.java.simpleName, message)SuppressLint("MissingPermission")fun …

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

图片恢复光影效果;通过拖拽等操作编辑3D实物;Cohere开源RAG技术;智能对话客服工具ChatGPT-On-CS

✨ 1: IntrinsicAnything 可以在光照条件未知的情况下,从单一图像中恢复出物体的材质 它就像是一位拥有高超技艺的画家,能够在仅有一张照片的情况下,准确地揭示出画中物体的材质,甚至在没有知道光线条件的情况下,都能…