Go语言接口使用

底层值为 nil 的接口值

即便接口内的具体值为 nil,方法仍然会被 nil 接收者调用。

在一些语言中,这会触发一个空指针异常,但在 Go 中通常会写一些方法来优雅地处理它(如本例中的 M 方法)。

注意: 保存了 nil 具体值的接口其自身并不为 nil。

nil接口值

nil 接口值既不保存值也不保存具体类型。

为 nil 接口调用方法会产生运行时错误,因为接口的元组内并未包含能够指明该调用哪个具体方法的类型。

空接口

指定了零个方法的接口值被称为 *空接口:*

inference{}

空接口可保存任何类型的值。(因为每个类型都至少实现了零个方法。)

空接口被用来处理未知类型的值。例如,fmt.Print 可接受类型为 interface{} 的任意数量的参数。

package mainimport "fmt"func main() {var i interface{}describe(i)i = 42describe(i)i = "hello"describe(i)
}func describe(i interface{}) {fmt.Printf("(%v, %T)\n", i, i)
}
错误

Go 程序使用 error 值来表示错误状态。

通常函数会返回一个 error 值,调用的它的代码应当判断这个错误是否等于 nil 来进行错误处理。

error 为 nil 时表示成功;非 nil 的 error 表示失败。

Reader
图像

image包定义了 Image 接口

Stringer

fmt包中定义的Stringer是最普遍的接口之一。

类型断言

类型断言提供了访问接口值底层具体值的方式。

t := i.(T)

该语句断言接口值 i 保存了具体类型 T,并将其底层类型为 T 的值赋予变量 t

若 i 并未保存 T 类型的值,该语句就会触发一个恐慌。

为了 判断 一个接口值是否保存了一个特定的类型,类型断言可返回两个值:其底层值以及一个报告断言是否成功的布尔值。

t, ok := i.(T)

若 i 保存了一个 T,那么 t 将会是其底层值,而 ok 为 true

否则,ok 将为 false 而 t 将为 T 类型的零值,程序并不会产生恐慌。

请注意这种语法和读取一个映射时的相同之处。

类型选择

类型选择是一种按顺序从几个类型断言中选择分支的结构。

类型选择与一般的 switch 语句相似,不过类型选择中的 case 为类型(而非值), 它们针对给定接口值所存储的值的类型进行比较。

switch v := i.(type) {
case T:// v 的类型为 T
case S:// v 的类型为 S
default:// 没有匹配,v 与 i 的类型相同
}// 代码实现
package mainimport "fmt"func do(i interface{}) {switch v := i.(type) {case int:fmt.Printf("Twice %v is %v\n", v, v*2)case string:fmt.Printf("%q is %v bytes long\n", v, len(v))default:fmt.Printf("I don't know about type %T!\n", v)}
}func main() {do(21)do("hello")do(true)
}

类型选择中的声明与类型断言 i.(T) 的语法相同,只是具体类型 T 被替换成了关键字 type

此选择语句判断接口值 i 保存的值类型是 T 还是 S。在 T 或 S 的情况下,变量 v 会分别按 T 或 S 类型保存 i 拥有的值。在默认(即没有匹配)的情况下,变量 v 与 i 的接口类型和值相同。

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

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

相关文章

要养生也要时尚,益百分满足你的所有需求

要养生也要时尚,益百分满足你的所有需求 艾灸是个好东西,尤其是在近几年的时候,艾灸就像一阵浪潮席卷进了人们的日常生活之中,我们可以在街边看到大大小小的艾灸馆,有些评价比较高的艾灸馆门前甚至还排起了长长的队伍…

Unity3D 分块编辑小AStar地图详解

前言 A算法是一种经典的寻路算法,能够帮助游戏中的角色找到最短路径。在本文中,我们将介绍如何在Unity3D中使用分块编辑的方式创建一个小的A地图,并实现A*算法来实现角色的寻路。 对惹,这里有一个游戏开发交流小组,希…

FasterViT:英伟达提出分层注意力,构造高吞吐CNN-ViT混合网络 | ICLR 2024

论文设计了新的CNN-ViT混合神经网络FasterViT,重点关注计算机视觉应用的图像吞吐能力。FasterViT结合CNN的局部特征学习的特性和ViT的全局建模特性,引入分层注意力(HAT)方法在降低计算成本的同时增加窗口间的交互。在包括分类、对…

【InternLM 实战营第二期笔记】Lagent AgentLego 智能体应用搭建

理论知识 Lagent 是什么 Lagent 是一个轻量级开源智能体框架,旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式,也支持了…

主流微前端框架对比与选择策略

微前端是一种架构风格,旨在将大型前端应用程序拆分为多个独立的模块,这些模块可以独立开发、测试和部署。主流的微前端框架有以下几种: Single-SPA:Single-SPA 是一个超级父级框架,可以与其他前端框架集成,…

linux环境变量设置

windows环境变量设置步骤: 右键"我的电脑"高级设置环境变量编辑"用户变量"或者"系统变量" linux下环境变量的设置步骤: 修改/etc/profile添加如下格式条目: export MAVEN_HOME/usr/local/apache-maven-3.6…

C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录 前言一、指针 - 整数二、指针 - 指针三、指针的关系运算四、指针和数组五、二级指针六、指针数组指针数组可以将几个一维数组模拟成二维数组 总结 前言 C语言指针整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几…

武汉大学博士,华为上班5年多,月薪多少。。。

最近,一位来自武汉大学的博士研究生透露了自己在华为公司工作五年后的薪酬情况。 据他透露,他在2018年加入华为时的月薪为2.4万,随着时间的推移,到了2023年,他的月薪已经增长至4.4万!此外,他还透…

工作后的自我介绍

您好,我叫Li,毕业于双一流**大学软件工程专业。 在大学期间通过四级,获得计算机C语言二级证书、科技立项奖(词频统计)、国家励志奖学金、优秀学生奖学金、优秀团干部、新生奖学金等。在校主修的课程有C、Java、数据结…

AI时代的GPU集群网络算力分析

浅谈GPU集群网络、集群规模和集群算力 引言在生成式AI(GenAI)和大模型时代,不仅需要关注单个GPU卡的算力,更要关注GPU集群的总有效算力。单个GPU卡的有效算力可以通过该卡的峰值算力来测算,例如,对于Nvidia…

class093 贪心经典题目专题5【左程云算法】

class093 贪心经典题目专题5【左程云算法】 前言版权推荐class093 贪心经典题目专题5最后 前言 2024-4-23 14:01:18 以下内容源自《【左程云算法】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://…

网络工程师----第十一天

OSPF: 对称加密算法: 也称为私钥加密或单密钥算法,是一种加密方式,其中加密和解密使用相同的密钥。这种算法的优点包括加密解密速度快、计算量小,适用于大量数据的加密。然而,它的缺点是密钥的安全性难以保…

SEHLL脚本编程---- Nginx日志分析6-统计每分钟的请求数

描述 假设Nginx的日志存储在nowcoder.txt里,内容如下: 192.168.1.20 - - [21/Apr/2020:14:12:49 0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefo…

深度相机(3D相机)

传统的RGB彩色相机称为2D相机, 只能得到2D的图像信息, 无法得到物体与相机的距离信息,也就是深度信息。 顾名思义, 深度相机除了获取2D信息,还能得到深度信息,也叫RGBD相机, 或3D相机。 顺便提…

被删除的照片和视频能找回吗?如何恢复手机删除的照片和视频?

手机里的照片和视频是我们记录生活的每一个瞬间,也是工作学习等场合经常用到的东西,一旦不慎丢失,将对我们造成很大损失。那么我们该如何恢复手机删除的照片和视频呢?通过掌握正确的恢复方法,能够最大程度地保护手机中…

网络常识!!!

网络常识!!! 一:网络的发展史二:关键的概念三:IP地址四:端口号二级目录二级目录二级目录二级目录三级目录 一:网络的发展史 从游戏方面发展历程进行理解: 从单机游戏-----游戏支持局域网对战-------游戏支持广域网对战-------移动端 (1)局域网对战:在同一个网吧里,不同的游戏…

2016年新华三杯复赛实验试题

2016年新华三杯复赛实验试题 拓扑图 配置需求 考生根据以下配置需求在 HCL 中的设备上进行相关配置。 以太网接口配置 将 S1、S2 的以太网接口 G1/0/1 至 G1/0/16 的模式用命令 combo enable copper 激活为电口。 虚拟局域网 为了减少广播,需要规划并配置 VLA…

Seurat -- Introduction to scRNA-seq integration 跟随学习记录

文章目录 数据是如何转换的原始ifnb数据对象Splits object后的数据对象数据对象构建完成后的标准流程Normalization后的数据对象scale 后的数据对象 不同的样本进行整合JoinLayers干了什么 数据是如何转换的 seurat object 中assays R N A l a y e r s RNAlayers RNAlayersco…

新的全息技术突破计算障碍

一种突破性的方法利用基于Lohmann透镜的衍射模型实时创建计算机生成全息图(CGH),在保持3D可视化质量的同时,大大降低了计算负荷要求。 全息显示为制作逼真的三维图像提供了一条令人兴奋的途径,这种图像给人以连续深度…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了,大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种,一种是srun,这种所见即所得的申请方式一般适用于短期的调试使用,大概一般允许的时间从几个小时到1天左右&…