Go语言 Interface(接口)

基本介绍

  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 Say
		animalAction(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 string
		i = "adf"
		str = i.(string)
		fmt.Print(str) // abc
	}
	func demo2(){
		var i interface{}
		var number int
		i = 123
		number = 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:1
		demo3("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 int
		demo4("abc")// is string
		demo4(true)//is bool
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java-spring-mvc(知识点讲解-第一天)-欢迎各位大佬提建议

目录 🎃MVC定义 🧨创建工程 🎨SpringMVC处理请求 请求分类及处理方式 静态请求 处理静态前端页面方式 动态请求 处理动态前端页面方式 ⚙小试牛刀 🏆常见问题 📌HTTP协议 超文本传输协议 请求 🎃MVC…

Web前端开发 小实训(二) 简易计算器

实训目的 学生能够使用函数完成简易计算器编写 操作步骤 1、请将加减乘除四个方法生成为以下函数,且有返回值 中文英语加法add减法subtract乘法multi除法division次幂pow()平方根sqrt() 提示: 除法中的除数不能为0! 参考代码&#xff1…

在线培训考试系统在线考试功能注意事项

在线培训考试系统在线考试功能注意事项 考试前务必注意是否开启防切屏、摄像头监考等防作弊措施,系统一旦检测到触发了疑似作弊行为会立刻自动交卷,考试终止; 答题者准备好后,可点击“开始答题”按钮进入考试,注意考…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一…

#C++里的引用#

目录 引用概念 定义引用类型 引用特性 常引用 传引用传参 传引用做返回值 1.引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 比如&#xff1a…

【AI】一文介绍索引增强生成RAG的原理和结构

今天向大家介绍一下关于RAG的一些知识和经验。 这里说的RAG可以理解为目前针对企业知识库问答等AI应用场景的解决方案,这个场景就是利用自然语言大模型LLM与用户自有的文件进行对话的能力。 【RAG的优势】 首先,讲一讲RAG的优势特征。 如果把AI想象成一个待上岗的人类助手,…

1、Flink DataStreamAPI 概述(上)

一、DataStream API 1、概述 1)Flink程序剖析 1.Flink程序组成 a)Flink程序基本组成 获取一个执行环境(execution environment);加载/创建初始数据;指定数据相关的转换;指定计算结果的存储…

模型 AIPL(认知、兴趣、购买、忠诚)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。品牌营销的量化与链路化。 1 AIPL模型的应用 1.1 耐克如何利用AIPL模型来推广其运动鞋和服装产品? 耐克利用AIPL模型来推广其运动鞋和服装产品,具体如下: 认知(…

为什么总说抖店做不好?做抖店需要注意这些问题,是不是都占了?

大家好,我是电商花花。 今天给大家总结了4个新手不注意又常犯的几个原因,这些建议都是我们做店这些年的实操经验,可以帮助大家做店自查,有责改之,无责加冕。 1、抖店核心是选品而不是玩法 很多新手在刚开始做店抖音小…

8K+/月!学习就业一把梭,祝贺誉天数通陈同学收获心仪offer !

大家好,我是誉天数通的陈同学。 在武汉,网络运维圈的人应该都会听过誉天的名字。作为华为的授权培训合作伙伴,誉天不仅提供专业全面的工程师培训,还以其独特的环境和氛围吸引着无数有志于在网络领域发展的朋友。 一年前的我&#…

用坐标与碰撞检测效果

用pygame碰撞检测子弹 与 子弹 格子检查是否在墙内 结果差不了多少 输出的是碰撞点坐标 在计算角色与强的距离是 你用了几条射线 2024/4/26 13:20:48 在代码中,用于计算角色与墙之间距离的部分是通过投射多条射线来实现的。具体来说,在循环中&#xf…

IDEA插件

POJO to JSON —— 实体转Json Smart Input —— 自动切换中英文 Translation —— 翻译 Maven Helper —— 依赖管理 .ignore —— 忽略提交文件 enum-quick-generate —— 枚举代码生成 粘贴到项目包下

前端更优雅的使用 jsonp

前端更优雅的使用 jsonp 背景:最近项目中又使用到了 jsonp 这一项跨域的技术,(主要还是受同源策略影响),下面有为大家提供封装好的函数及对应使用示例,欢迎大家阅读理解 文章目录 前端更优雅的使用 jsonp同…

基于车载点云数据的城市道路特征目标提取与三维重构

作者:邓宇彤,李峰,周思齐等 来源:《北京工业大学学报》 编辑:东岸因为一点人工一点智能公众号 基于车载点云数据的城市道路特征目标提取与三维重构本研究旨在弥补现有研究在处理复杂环境和大数据量上的不足&#xf…

Qt设置可执行程序图标,并打包发布

一、设置图标 图标png转ico: https://www.toolhelper.cn/Image/ImageToIco设置可执行程序图标 修改可执行程序图标 添加一个rc文件,操作如下,记得后缀改为rc 打开logo.rc文件添加代码IDI_ICON1 ICON DISCARDABLE "logo.ico"在项目pro后缀名的文件中添加代码 RC_…

系统盘空间不足调优方式1-APPData/大文件清理

作者:私语茶馆 1.前言 Windows系统盘(C盘)很容易剩余空间不足,这种情况下会非常影响Windows系统的运行,系统盘约束非常多,不方便在线扩容,因此规划和利用好系统盘是保障整体运行效率的关键。包…

机器人系统开发ros2-基础实践01-学会自定义一个机器人动作aciton实体类

您之前在了解操作教程中了解了action 。与其他通信类型及其各自的接口(主题/消息和服务/srv)一样,您也可以在包中自定义操作。本教程向您展示如何定义和构建可与您将在下一个教程中编写的action服务器和action 客户端一起使用的操作。 需要理…

Rust 实战练习 - 12. Axum Web 简单demo

Rust Web 历程 Rust 的异步框架tokio非他莫属,而web框架一直是悬而未决,说到底还是因为没有官方成熟的方案指引,大家各玩各的,互不兼容,白白浪费精力。 这个事情一直等到半官方组织tokio推出axum有了改善。但是市场上…

LeetCode455:分发饼干

题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个…

Orange3数据可视化(组件概览)

概要 大家见过Orange3提供的丰富数据可视化组件吗? Orange3为您提供了一系列生动的图表工具,包括树图、箱线图、小提琴图、分布图、散点图、折线图、条形图、筛图、马赛克图、自由投影、线性投影、雷达图、热力图、韦恩图、轮廓图、毕达哥拉斯树、毕达哥…
最新文章