Golang之路---03 面向对象——空接口

空接口

什么是空接口

  空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口。

type empty_iface interface {
}

每一个接口都包含两个属性,一个是值,一个是类型。
而对于空接口来说,这两者都是 nil。

eg:

package mainimport ("fmt"
)//定义一个接口
type order interface{countmoney() intpaymoney() string
}type roastrice struct{name stringquantity int  price int
}func main(){rice := roastrice{"烤饭",5,2,}fmt.Printf("type: %T,value: %v\n",rice,rice)//定义一个空接口var i interface{}fmt.Printf("type: %T,value: %v\n",i,i)/* type: main.roastrice,value: {烤饭 5 2}type: <nil>,value: <nil>*/
}

空接口的作用

第一,通常我们会直接使用 interface{} 作为类型声明一个实例,而这个实例可以承载任意类型的值。

//如下,空接口可以存int,字符串,布尔值...
func main(){//定义一个空接口var i interface{}i=1fmt.Println(i)i="hello"fmt.Println(i)i=falsefmt.Println(i)/* 1hellofalse */
}

第二,如果想让你的函数可以接收任意类型的值 ,也可以使用空接口
eg:接收一个任意类型的值

func muyfunc(iface interface{}){fmt.Println(iface)
}func main(){a := 10b := "golang"c := falsemuyfunc(a)muyfunc(b)muyfunc(c)/* 10golangfalse */
}

eg:接收任意多个类型的值

func muyfunc(ifaces ...interface{}){for _,iface := range ifaces{fmt.Println(iface)}
}
func main(){a := 10b := "golang"c := falsemuyfunc(a,b,c)/*10golangfalse*/
}

第三,你也定义一个可以接收任意类型的 array、slice、map、strcut

func main(){any := make([]interface{},5)any[0] = 11any[1] = "hello world"any[2] = []int{11,22,33,55}for _,value := range any{fmt.Println(value)}/* 11hello world[11 22 33 55]<nil><nil> */
}

使用空接口的注意事项

  1. 空接口可以承载任意值,但不代表任意类型就可以承接空接口类型的值

从实现的角度看,任何类型的值都满足空接口。因此空接口类型可以保存任何值,也可以从空接口中取出原值。

但要是你把一个空接口类型的对象,再赋值给一个固定类型(比如 int, string等类型)的对象赋值,是会报错的。

  1. 空接口承载数组和切片后,该对象无法再进行切片
  2. 当你使用空接口来接收任意类型的参数时,它的静态类型是 interface{},但动态类型(是 int,string 还是其他类型)我们并不知道,因此需要使用类型断言。
func myfunc(i interface{})  {switch i.(type) {case int:fmt.Println("参数的类型是 int")case string:fmt.Println("参数的类型是 string")}
}
func main() {a := 10b := "hello"myfunc(a)myfunc(b)
}//参数的类型是 int
//参数的类型是 string

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp uni-combox 下拉提示无匹配项(完美解决--附加源码解决方案及思路)

问题描述 匆匆忙忙又到了周一啦&#xff0c;一大早就来了一个头疼的问题&#xff0c;把我难得团团转&#xff0c;呜呜呜~ 下面我用代码的方式展示出来&#xff0c;看下你的代码是否与我的不同。 解决方案 <uni-forms-item label"名称" name"drugName&quo…

Python: Django 服务部署可能遇到的一些问题

502 bad gateway 不要用 python3 manage.py runserver 启动服务&#xff0c; 而要用&#xff1a; daphne -b 0.0.0.0 -p <端口> <工程名>.asgi:application此外&#xff0c;在 setting.py 中&#xff0c;修改&#xff1a; import osSECRET_KEY os.environ.get(D…

镜头基础知识

本文介绍镜头基础知识。 1.焦距 焦距指透镜中心到光聚集之焦点的距离&#xff0c;如下图&#xff0c;通常用f表示。 焦距是正值&#xff0c;一束平行光将会聚集在一个点上&#xff0c;焦距是负值&#xff0c;一束平行光在通过透镜之后将会扩散开。 注意&#xff1a; 1)这里…

[C++项目] Boost文档 站内搜索引擎(2): 文档文本解析模块parser的实现、如何对文档文件去标签、如何获取文档标题...

项目开始的准备工作 在上一篇文章中, 已经从Boost官网获取了Boost库的源码. 相关文章: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍… 接下来就要编写代码了. 不过还需要做一些准备工作. 创建项目目录 所有的项目文件肯定要在一…

JVM问题

1. jvm运行时区域划分及每个区域的作用 堆、方法区&#xff08;元空间&#xff09;、虚拟机栈、本地方法栈、程序计数器 2. 堆内存分配策略&#xff1a;新生代&#xff0c;老年代&#xff0c;gc时机 • 对象优先分配在Eden区&#xff0c;如果Eden区没有足够的空间进行分配时&am…

【Linux命令200例】which用于查找指定命令所在路径

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

文件的写入 和 读取

文件的写入 需要包含的头文件 #include <unistd.h> 相关的API函数 ssize_t write(int fd, const void *buf, size_t count); 参数说明 int fd &#xff1a;文件描述符const void *buf &#xff1a;一个无类型的指针buf&#xff0c;是一个缓冲区size_t count&#xf…

22.Netty源码之解码器

highlight: arduino-light 抽象解码类 https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ 解码器 Netty 常用解码器类型&#xff1a; ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象&#xff1b;MessageToMessageDecoder 将一种消息类型解码为另外一种消息类…

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

1376:信使(msner)---信息学奥赛一本通

【题目描述】 战争时期&#xff0c;前线有n个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。指挥部设在第一个哨所。当指挥部下达一个命令…

HOT71-字符串解码

leetcode原题链接: 字符串解码 题目描述 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的&#xff1b;输…

mybatis框架异常org.apache.ibatis.exceptions.PersistenceException

错误复现 &#xff1a; postman调接口的时候出现了这样的错误&#xff1a; ex org.apache.ibatis.exceptions.PersistenceException 报错原因&#xff1a; 出现这个org.apache.ibatis.exceptions.PersistenceException问题大多数都是找不到映射文件&#xff0c;这和没有遵…

C++游戏服务器框架笔记(五)_封装Epoll

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select C游戏服务器框架笔记(五)_封装Epoll类 在上一文中已经介绍了&#xff0c;为了将Windows下的select()和linux下…

数据结构——单链表OJ题(第二弹)

单链表OJ题 前言一、返回链表开始入环的第一个节点思路一思路二 二、返回链表的深度拷贝总结 前言 此次练习题有两道&#xff01; 有点小难度&#xff0c;但相信难不住大家的&#xff01; 我也会给出两道OJ题的链接&#xff0c;大家也赶快去试一试吧 一、返回链表开始入环的第…

实验3-11 计算油费 (15 分)

实验3-11 计算油费 &#xff08;15 分&#xff09; 现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客&#xff0c;某自动加油站推出了“自助服务”和“协助服务”两个服务等级&#xff0c;分别可得到5%和3%的折扣。 本题要求编写程序&#xff0c;根据…

【网络基础进阶之路】基于MGRE多点协议的实战详解

PS&#xff1a;本要求基于华为的eNSP模拟软件进行 具体要求&#xff1a; 完成步骤&#xff1a; 1、根据上述要求&#xff0c;对各路由器进行地址安排&#xff0c;如下图。 2、进入各路由器&#xff0c;对每个端口进行地址设置。 R1路由器设置&#xff1a; ISP路由器设置&…

Go如何构建高效API接口| 青训营

Go语言作为一个高效的静态类型语言&#xff0c;在构建API服务时也表现出了很大的优势。本文将介绍如何使用Go语言构建高效的API服务&#xff0c;帮助开发者更好地应对日益增长的API需求。 一、选择适合的框架 首先&#xff0c;选择适合的框架是构建高效API服务的重要一步。在…

淘宝资源采集(从零开始学习淘宝数据爬取)

1. 为什么要进行淘宝数据爬取&#xff1f; 淘宝数据爬取是指通过自动化程序从淘宝网站上获取数据的过程。这些数据可以包括商品信息、销售数据、评论等等。淘宝数据爬取可以帮助您了解市场趋势、优化您的产品选择以及提高销售额。 淘宝作为全球的电商平台&#xff0c;每天都有…

flutter:占位视图(骨架屏、shimmer)

前言 有时候打开美团&#xff0c;在刚加载数据时会显示一个占位视图&#xff0c;如下&#xff1a; 那么这个是如何实现的呢&#xff1f;我们可以使用shimmer来开发该功能 实现 官方文档 https://pub-web.flutter-io.cn/packages/shimmer 安装 flutter pub add shimmer示例…

2023年08月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…