Go语言 Interface(接口)

devtools/2024/9/22 23:48:11/

基本介绍

  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/devtools/20075.html

相关文章

数据结构 -- 二叉树二叉搜索树

二叉树 二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 重要的二叉树结构 完全二叉树(complete binary tree)是一种二叉树结构,除最后一层以外,每一层都必须填满,填充时要遵…

富格林:正确曝光做单欺诈套路

富格林悉知,黄金是一种不错的投资产品,其具有良好的避险作用。选择已曝光的正确黄金产品,也能把握不错的收益。虽然黄金投资的对象单一,但这并不意味着投资者可以轻而易举获得收益,要想获得收益就得杜绝欺诈套路。下面…

C++模板 简单实验

C模板是泛型编程的一个关键组成部分&#xff0c;允许程序员编写独立于数据类型的代码。下面是一些C模板的应用举例&#xff1a; 1. 函数模板 函数模板允许我们编写一个函数&#xff0c;它可以接受多种类型的参数。 template <typename T> T add(T a, T b) { ret…

OpenCV直方图计算

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现直方图均衡 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::split 将图像划分…

大创项目推荐 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

sheng的学习笔记-AI-支持向量机(SVM)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题&#xff1a; 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

书生·浦语大模型开源体系(四)笔记

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

MySQL常见的约束

什么是约束&#xff1f; 限制&#xff0c;限制我们表中的数据&#xff0c;保证添加到数据表中的数据准确和可靠性&#xff01;凡是不符合约束的数据&#xff0c;插入时就会失败&#xff0c;插入不进去的&#xff01; 比如&#xff1a;学生信息表中&#xff0c;学号就会约束不…