当前位置: 首页 > 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 中文版...

机器学习入门实战指南:从零搭建环境到完成第一个分类项目

1. 项目概述&#xff1a;从零开始的机器学习之旅“机器学习”这个词&#xff0c;听起来是不是既酷炫又让人望而生畏&#xff1f;你可能在新闻里看到它驱动着自动驾驶汽车&#xff0c;在手机里体验过它带来的智能推荐&#xff0c;甚至听说它正在改变各行各业。但当你真正想自己动…...

嵌入式学习的第八天

字符指针常见错误 核心&#xff1a;字符串常量存只读内存&#xff0c;不可修改&#xff01; #include <stdio.h> int main() {// 错误写法&#xff1a;指针指向字符串常量&#xff08;只读&#xff09;&#xff0c;不能修改内容char *p "hello"; // *(p0) e…...

电脑安装双系统

电脑安装双系统 本次是在Windows 10的环境下安装Ubuntu的系统。 1、可能需要的准备工作 首先打开cmd输入msinfo32的命令查看电脑的BIOS的模式是不是UEFI,如下所示&#xff1a; 本次安装系统基于以上的BIOS模式下。此外如果遇到安装之后不能跳转到ubuntu系统的问题&#xff…...

STM32F103C8T6驱动BMP280气压模块:从I2C地址纠错到数据转换的完整避坑指南

STM32F103C8T6驱动BMP280气压模块&#xff1a;从I2C地址纠错到数据转换的完整避坑指南 在嵌入式开发中&#xff0c;气压传感器BMP280因其高精度和低成本成为许多项目的首选。然而&#xff0c;当这个看似简单的模块遇上STM32F103C8T6这颗经典的MCU时&#xff0c;不少开发者却踩进…...

别再只盯着p值和FC了!用DisGeNET给你的Hub Gene打分,提升下游验证成功率

别再只盯着p值和FC了&#xff01;用DisGeNET给你的Hub Gene打分&#xff0c;提升下游验证成功率 在基因功能研究的海洋中&#xff0c;Hub Gene如同灯塔般指引着研究方向。然而&#xff0c;许多研究者仍被困在传统筛选方法的局限中——过度依赖差异表达基因的p值和fold change阈…...

别再为测试视频发愁了!手把手教你用FFmpeg生成YUV/RGB原始数据(附播放命令)

音视频开发实战&#xff1a;FFmpeg高效生成与播放YUV/RGB测试素材指南 在音视频编解码器开发、计算机视觉算法测试或多媒体性能调优过程中&#xff0c;开发者经常面临一个共同难题&#xff1a;如何快速获取特定像素格式的原始视频数据作为测试素材&#xff1f;网上现成的YUV或R…...

告别只会显示字符串:用STM32G431 HAL库玩转LCD多行刷新与动态数据

STM32G431 HAL库实战&#xff1a;LCD多行刷新与动态数据优化技巧 在嵌入式开发竞赛和项目中&#xff0c;LCD屏幕的动态数据显示往往是评判系统完成度的重要指标。许多开发者虽然能够实现基础字符串显示&#xff0c;却在面对实时数据更新、多行内容刷新时陷入性能瓶颈——屏幕闪…...

从U盘启动OpenWRT:零门槛打造你的x86软路由实验平台

1. 为什么选择U盘启动OpenWRT软路由&#xff1f; 去年我帮朋友改造旧笔记本时&#xff0c;偶然发现用U盘跑OpenWRT简直是个宝藏方案。相比直接刷入硬盘&#xff0c;U盘启动有三大不可替代的优势&#xff1a;零成本实验、无损体验和随身携带。你完全可以用吃灰的旧U盘&#xff0…...

能碳数据治理与建模引擎:MyEMS 开源方案打造企业能源管理数字底座

在企业数字化转型的深水区&#xff0c;能源数据正从分散的报表附件演变为支撑经营决策的核心资产。然而&#xff0c;多数企业的能源数据仍面临采集标准不一、存储格式杂乱、分析口径各异等现实困境&#xff0c;数据治理成为能源管理升级的首要门槛。当双碳战略进入精细化实施阶…...

STM32 ADC采样不准?别急着调代码,先检查VDDA和VREF+的供电(附实测波形)

STM32 ADC采样精度优化&#xff1a;从硬件设计到实测验证的完整指南 在嵌入式系统开发中&#xff0c;ADC采样精度问题往往让工程师陷入软件调试的泥潭。当发现采样值波动大、线性度差时&#xff0c;多数人的第一反应是检查代码配置——采样周期够不够&#xff1f;校准是否正确…...