当前位置: 首页 > news >正文

Go 之 interface接口理解

go语言并没有面向对象的相关概念,go语言提到的接口和java、c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承、子类、implements关键词。go语言通过隐性的方式实现了接口功能,相对比较灵活。

interface是go语言的一大特性,主要有以下几个特点:

  • interface 是方法或行为声明的集合
  • interface接口方式实现比较隐性,任何类型的对象实现interface所包含的全部方法,则表明该类型实现了该接口。
  • interface还可以作为一中通用的类型,其他类型变量可以给interface声明的变量赋值。
  • interface 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。

下面是一些代码示例

接口实现

package mainimport "fmt"type Animal interface {GetAge() int32GetType() string
}type Dog struct {Age  int32Type string
}func (a *Dog) GetAge() int32 {return a.Age
}
func (a *Dog) GetType() string {return a.Type
}func main() {animal := &Dog{Age: 20, Type: "DOG"}fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())}

interface作为通用类型

package mainimport ("fmt""reflect"
)type User struct {Id     intName   stringAmount float64
}func main() {var i interface{}i = "string"fmt.Println(i)i = 1fmt.Println(i)i = User{Id: 2}//i.(User).Id = 15  //运行此处会报错,在函数中修改interface表示的结构体的成员变量的值,编译时遇到这个编译错误,cannot assign to i.(User).Idfmt.Println(i.(User).Id)}

注意:

不可用i:=interface{} 这种形式,因为不能确定i的具体类型,会报type interface {} is not an expression 错误。

interface接口查询

接口查询,在一个接口变量中,查询所赋值的对象有没有实现其他接口所有的方法的过程,就是查询接口。即接口A实现了接口B中所有的方法,那么通过查询赋值A可以转化为B。

代码示例

package mainimport "fmt"type Animal interface {GetAge() int32GetType() string
}
type AnimalB interface {GetAge() int32
}type Dog struct {Age  int32Type string
}func (a *Dog) GetAge() int32 {return a.Age
}
func (a *Dog) GetType() string {return a.Type
}func main() {var animal Animal = &Dog{Age: 20, Type: "DOG"}fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())var animalb AnimalB = &Dog{Age: 20, Type: "DOG"}fmt.Printf("max age is: %d", animalb.GetAge())//这里实现了animalb 转化Animal接口val, ok := animalb.(Animal)if !ok {fmt.Println("ok")} else {fmt.Printf("%s max age is: %d", val.GetType(), val.GetAge())}
}

接口转化很简单

val, ok := animalb.(Animal)

注意,animalb 只有AnimalB所包含的方法GetAge()。

如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A,反之则不行。

接口类型查询

只能对interface{}类型的变量使用类型查询

示例

package mainimport "fmt"type Animal interface {GetAge() int32GetType() string
}
type AnimalB interface {GetAge() int32
}type Dog struct {Age  int32Type string
}func (a *Dog) GetAge() int32 {return a.Age
}
func (a *Dog) GetType() string {return a.Type
}func main() {var i interface{}//i = "ok"//方法一val, ok := i.(Animal)if !ok {fmt.Println("no")} else {fmt.Println(val.GetAge())}// 方法二switch val := i.(type) {case string:fmt.Println(val)case int:fmt.Println(val)default:fmt.Println(val)}// 方法三 通过反射typename := reflect.TypeOf(i)fmt.Println(typename)
}

interface默认nil所以查出是nil,如果给i赋值一个字符型值(去掉i = "ok"前面的注释),则返回

no
ok
string

相关文章:

Go 之 interface接口理解

go语言并没有面向对象的相关概念,go语言提到的接口和java、c等语言提到的接口不同,它不会显示的说明实现了接口,没有继承、子类、implements关键词。go语言通过隐性的方式实现了接口功能,相对比较灵活。 interface是go语言的一大…...

简约在线生成短网址系统源码 短链防红域名系统 带后台

简约在线生成短网址系统源码 短链防红域名系统 带后台 安装教程:访问 http://你的域名/install 进行安装 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/...

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…...

Hive大表join大表如何调优

目录 一、调优思路1、SQL优化1.1 大小表join1.2 大大表join 2、insert into替换union all3、排序order by换位sort by4、并行执行5、数据倾斜优化6、小文件优化 二、实战2.1 场景2.2 限制所需的字段,间接mapjoin2.2 解决异常值倾斜,如NULL加随机数打散2.…...

SAF文件选择、谷歌PhotoPicker图片视频选择与真实路径转换

一、构建选择文件与回调方法 //文件选择回调ActivityResultLauncher<String[]> pickFile registerForActivityResult(new ActivityResultContracts.OpenDocument(), uri->{if (uri ! null) {Log.e("cxy", "返回的uri:" uri);Log.e("cxy&q…...

java可变参数

前言 我们虽然能够用重载实现&#xff0c;但多个参数无法弹性匹配 代码 class mycalculator{//下面的四个calculate方法构成了重载//计算2个数的和&#xff0c;3个数的和&#xff0c;4&#xff0c;5&#xff0c;6个数的和// public void calculate(int n1){// System.out.…...

Flutter 中的 Expanded 小部件:全面指南

Flutter 中的 Expanded 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Expanded 是一个用于控制子控件占据可用空间的布局小部件&#xff0c;通常与 Row、Column 或 Flex 等父级布局小部件一起使用。Expanded 允许你创建灵活的布局&#xff0c;其中子控件可以按照指定…...

[Kubernetes] KubeKey 部署 K8s v1.28.8

文章目录 1.K8s 部署方式2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.K8s 部署方式 kubeadm: kubekey, sealos, kubespray二进制: kubeaszrancher 2.操作系统基础配置 主机名内网IP外网IPmaster192.168.66.2139.198.9.7node1192.168.66.3139.198.40.17…...

C# 与 Qt 的对比分析

C# 与 Qt 的对比分析 目录 C# 与 Qt 的对比分析 1. 语言特性 2. 开发环境 3. 框架和库 4. 用户界面设计 5. 企业级应用 6. 性能考量 在软件开发领域&#xff0c;C# 和 Qt 是两种常用的技术栈&#xff0c;它们分别在.NET平台和跨平台桌面应用开发中占据重要位置。本文将深…...

MapReduce | 二次排序

1.需求 主播数据--按照观众人数降序排序&#xff0c;如果观众人数相同&#xff0c;按照直播时长降序 # 案例数据 用户id 观众人数 直播时长 团团 300 1000 小黑 200 2000 哦吼 400 7000 卢本伟 100 6000 八戒 250 5000 悟空 100 4000 唐僧 100 3000 # 期望结果 哦吼 4…...

Java后端初始化项目(项目模板)

介绍 emmmm&#xff0c;最近看了一些网络资料&#xff0c;也是心血来潮&#xff0c;想自己手工搭建一个java后端的初始化项目模板来简化一下开发&#xff0c;也就发一个模板的具体制作流程&#xff0c;&#xff08;一步一步搭建&#xff0c;从易到难&#xff09; ok&#xff…...

electron 多窗口 vuex/pinia 数据状态同步简易方案(利用 LocalStorage)

全局 stroe 添加 mutations 状态同步方法 // 用于其他窗口同步 vuex 中的 DeviceTcpDataasyncDeviceTcpData(state: StateType, data: any) {state.deviceTcpData data},App.vue 里 onMounted(() > {console.log("App mounted");/*** vuex 多窗口 store 同步*//…...

自定义数据集图像分类实现

模型训练 要使用自己的图片分类数据集进行训练&#xff0c;这意味着数据集应该包含一个目录&#xff0c;其中每个子目录代表一个类别&#xff0c;子目录中包含该类别的所有图片。以下是一个使用Keras和TensorFlow加载自定义图片数据集进行分类训练的例子。 我们自己创建的数据集…...

【C++】手搓读写ini文件源码

【C】手搓读写ini文件源码 思路需求&#xff1a;ini.hini.cppconfig.confmian.cpp 思路 ini文件是一种系统配置文件&#xff0c;它有特定的格式组成。通常做法&#xff0c;我们读取ini文件并按照ini格式进行解析即可。在c语言中&#xff0c;提供了模板类的功能&#xff0c;所以…...

undolog

undolog回滚段 undolog执行的时间&#xff1a;在执行器操作bufferpool之前。 undolog页...

项目文档分享

Hello , 我是小恒。提前祝福妈妈母亲节快乐 。 本文写一篇初成的项目文档 &#xff08;不是README.md哈&#xff09;&#xff0c;仅供参考 项目名称 脚本存储网页 项目简介 本项目旨在创建一个网页&#xff0c;用于存储和展示各种命令&#xff0c;用户可以通过粘贴复制命令到…...

【深耕 Python】Quantum Computing 量子计算机(5)量子物理概念(二)

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 【深耕 Python】Quantum Computing 量子计算机&#xff08;2&#xff09;绘制电子运动平面波 【深耕 Python】Quantum Computing 量子计算机&…...

手写Spring5【笔记】

Spring5【笔记】 前言前言推荐Spring5【笔记】1介绍2手写 最后 前言 这是陈旧已久的草稿2022-12-01 23:32:59 这个是刷B站的时候&#xff0c;看到一个手写Spring的课程。 最后我自己好像运行不了&#xff0c;就没写。 现在2024-5-12 22:22:46&#xff0c;发布到[笔记]专栏中…...

2024中国(重庆)机器人展览会8月举办

2024中国(重庆)机器人展览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 2024中国重庆机器人展会将汇聚机器人全产业链知名企业&#xff0c;世界科技领先的生产制造企业与来自多个国家和地区…...

Apache 开源项目文档中心 (英文 + 中文)

进度&#xff1a;持续更新中。。。 Apache Ambari 2.7.5 Apache Ambari Installation 2.7.5.0 (latest)Apache Ambari Installation 2.7.5.0 中文版 (latest) Apache DolphinScheduler Apache DolphinScheduler 1.2.0 中文版Apache DolphinScheduler 1.2.1 中文版...

用STM32F103C8T6做个宠物喂食器:从电路图到代码的保姆级DIY教程

用STM32F103C8T6打造智能宠物喂食器&#xff1a;从硬件搭建到软件调优全流程解析 养宠物的朋友都知道&#xff0c;定时定量喂食对宠物健康至关重要。今天我们就来手把手教你如何用STM32F103C8T6单片机打造一个智能宠物喂食器&#xff0c;不仅能定时投喂&#xff0c;还能识别不…...

来自硅谷的顶级外卖-Claude Code 源码泄露事件讨论

Claude Code 源码泄露事件全解析摘要&#xff1a;2026年3月&#xff0c;Anthropic 旗下 AI 编程工具 Claude Code 的完整源码被人通过匿名渠道公开。这次泄露撕开了这款"明星产品"的外衣——5层模块架构、20安全验证器、自研 Ink 渲染引擎、四层记忆系统。代码里没有…...

内网外网互传文件慢怎么办?高速传输协议该如何选择?

企业日常办公中&#xff0c;内外网文件互传卡顿、中断、速度不达标的问题十分普遍&#xff0c;尤其在大文件与批量文件场景下&#xff0c;传统方式难以满足稳定高效的需求。选择合适的高速传输方案&#xff0c;直接影响跨网协作效率与数据安全&#xff0c;这也是多数运维与业务…...

实践指南:运用语义熵为LLM生成内容构建“幻觉防火墙”

1. 什么是语义熵&#xff1f;为什么它能成为LLM的"幻觉防火墙"&#xff1f; 第一次听到"语义熵"这个词时&#xff0c;我正被一个智能客服项目折磨得焦头烂额。当时我们的GPT-3.5模型总喜欢给用户编造不存在的产品功能&#xff0c;就像个过度热情的销售员。…...

Ultimate ASI Loader深度解析:构建Windows游戏插件生态系统的技术实践

Ultimate ASI Loader深度解析&#xff1a;构建Windows游戏插件生态系统的技术实践 【免费下载链接】Ultimate-ASI-Loader The Ultimate ASI Loader is a proxy DLL that loads custom .asi libraries into any game process. 项目地址: https://gitcode.com/gh_mirrors/ul/Ul…...

程序员副业变现全攻略

CSDN程序员副业图谱技术文章大纲副业方向分类技术变现类&#xff1a;外包开发、技术咨询、代码审核内容创作类&#xff1a;技术博客、视频教程、电子书编写产品开发类&#xff1a;独立应用、开源项目、插件工具教育培训类&#xff1a;在线课程、一对一辅导、技术直播技术栈与工…...

MySQL 8.0.34和5.7.43双版本共存安装指南(Windows环境避坑大全)

MySQL 8.0与5.7双版本共存实战&#xff1a;Windows环境全流程避坑指南 1. 版本共存的核心挑战与解决方案 在开发环境中同时运行MySQL 8.0和5.7版本的需求日益普遍——可能是为了兼容旧系统&#xff0c;或是测试应用在不同版本下的表现。但Windows环境下实现双版本共存会遇到几个…...

从HBM到IEC61000-4-2:解码三大ESD模型在芯片与整机设计中的关键分野

1. 为什么你的芯片还是被静电打坏了&#xff1f; 很多硬件工程师都有过这样的困惑&#xff1a;明明选用的芯片数据手册上明确标注了"ESD防护等级2000V"&#xff0c;为什么产品到客户手里还是频繁出现静电损坏&#xff1f;上周我就遇到一个真实案例——某智能门锁厂商…...

从‘发快递’到‘收快递’:手把手拆解RocketMQ 5.x中Producer Group的变迁与最佳实践

从‘发快递’到‘收快递’&#xff1a;手把手拆解RocketMQ 5.x中Producer Group的变迁与最佳实践 在消息中间件的世界里&#xff0c;RocketMQ一直以其高吞吐、低延迟的特性占据着重要地位。随着5.x版本的发布&#xff0c;一个看似微小的改动——生产者匿名化&#xff0c;却在实…...

iptables实战指南:从链表关系到规则配置的完整解析

1. iptables基础概念与核心组件 第一次接触iptables时&#xff0c;我盯着那些复杂的规则配置看了整整一个下午。后来才发现&#xff0c;理解iptables的关键在于掌握它的"四表五链"架构。简单来说&#xff0c;iptables就像是一个多层安检系统&#xff0c;数据包要经过…...