Golang-interface(二 接口与nil)

golang中interface判断nil问题 interface数据的表示 参阅http://research.swtch.com/interfaces 在示例中,我们定义一个interface名为Stringer,同时定义一个符合其定义的Binary类型: type Stringer interface {     String() string } 阅读详情

github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md 

一 接口与nil

前面讲解了go语言中接口的基本使用方法,下面将说一说nil在接口中的使用。

从上面一节我们知道在底层,interface作为两个成员实现:一个类型和一个值。该值被称为接口的动态值, 它是一个任意的具体值,而该接口的类型则为该值的类型。对于 int 值3, 一个接口值示意性地包含(int, 3)。

只有在内部值和类型都未设置时(nil, nil),一个接口的值才为 nil。特别是,一个 nil 接口将总是拥有一个 nil 类型。若我们在一个接口值中存储一个 int 类型的指针,则内部类型将为 int,无论该指针的值是什么,这样的接口值会是非 nil 的,即使在该指针的内部值为 nil,形如(*int, nil)。

下面是一个错误的错误返回方式:

func returnsError() error {
    var p *MyError = nil
    if bad() {
        p = ErrBad
    }

    return p // Will always return a non-nil error.
}

这里 p 返回的是一个有效值(非nil),值为 nil。

因此,下面判断错误的代码会有问题:

func main() {
    if err := returnsError(); err != nil {
        panic(nil)
    }
}

上面的if判断永远为真,因为resturnsError返回的值的类型不为nil。

针对 returnsError 的问题,可以这样处理(不建议的方式):

func main() {
    if err := returnsError(); err.(*MyError) != nil {
        panic(nil)
    }
}

在判断前先将err转型为*MyError,然后再判断err的值。 类似的C语言空字符串可以这样判断:

bool IsEmptyStr(const char* str) {
    return !(str && str[0] != '\0');
}

但是Go语言中标准的错误返回方式不是returnsError这样。 下面是改进的returnsError:

func returnsError() error {

    var p *MyError = nil
    if bad() {
        return nil
    }
    return p // Will always return a non-nil error.
}

二 小结

在处理错误返回值的时候,一定要将正常的错误值转换为 nil。



go interface{}==nil 几种坑及原理 本文是Go比较有名的一个坑,在以前面试的时候也被问过,为什么想起来写这个? 因为我们线上就真实出现过这个坑,写给不了解的人在使用 if err != nil 的时候提高警惕。 Go语言的interface{}在使用过程中有一个特别坑的特性,当你比较一个interface{}类型的值是否是nil的时候,这是需要特别注意避免的问题。 先来看看一个demo: package main import "... 阅读详情

相关推荐

Qt自带绘图与GDI+绘图方式比较_gdi+实时绘制qt(2)

2、GDI+是Windows操作系统中的图形设备接口,它提供了一套用于绘制图形的API,包括了图形渲染、图形变换、图形剪切、图形填充等功能,使开发者可以快速地开发出各种类型的图形应用程序。1、Qt是一个跨平台的C++应用程序框架,它提供了一套用于GUI编程的类库,包括了绘图、网络、XML、数据库、多线程等模块,使开发者可以快速地开发出高质量的跨平台应用程序。Qt提供了一套用于绘图的类库,包括了QPainter、QPen、QBrush等类,使开发者可以快速地进行图形绘制。

qq_17136213的博客 917

golang interface类型的nil

golang中interface变量,底层两个对象来存,一个是type、一个是value,只有type、value都为nil时,interface变量才是nil。可以看到interface 变量i,虽然值为nil,但类型是Student。如果想判断变量value是否为空,可以指定type。

菜鸟的博客 813

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6033

golang: 详解interface和nil

为什么80%的码农都做不了架构师?>>> ...

weixin_34144848的博客 424

autoDL算力云装Xinference[坑与步骤]

在页面直接点击下载会出现下着下载进度条消失,试了几次才出现这个报错,现在我们就继续安装缺少的包吧。这一步成功绕开了系统盘空间限制。先租用一个合适的服务器,建议不要选最新版本,跟我选的一样即可,不然后面会出现。最近在 AutoDL 上尝试部署。🚫 不要直接使用以下命令。点击下面链接即可打开。

ngadminq的博客 2383

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

Golang interface(接口)的nil判断

nil在Go语言中只能被赋值给指针和接口。接口在底层的实现有两部分:type和data(参考上一篇博客:https://blog.youkuaiyun.com/weixin_42117918/article/details/90372113)。在源码中,显示地将nil赋值给接口时,接口的type和data都将为nil。此时,接口与nil值判断是相等的。但如果将一个带有类型的nil赋值给接口时,只有data为n...

weixin_42117918的博客 3782

BMS短路测试避坑指南:从炸管到稳定,我是如何搞定MOS管和TVS的

本文详细记录了BMS短路测试中MOS管和TVS的优化过程,从驱动电阻调整、PCB寄生参数控制到TVS选配策略,提供了一套实用的调试方法论。通过实战案例解析,帮助工程师避免常见陷阱,实现稳定可靠的短路测试性能。

weixin_30652897的博客 140

77.Go中interface{}判nil的正确姿势

在go中的nil只能赋值给指针、channel、func、interface、map或slice类型的变量interface是否根据是否包含有method,底层实现上用两种structiface 和 eface。eface:表示不含method的interface结构,或者叫。对于Golang中的大部分数据类型都可以抽象出来_type结构,同时针对不同的类型还会有一些其他信息。iface: 表示的底层实现。相比于non-empty要包含一些method。method的具体实现存放在itab.fun变量里。

YouMing_Li的博客 1765

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2618

【硬件工程师面经整理2_电源篇】

硬件工程师面经整理_电源篇

LeeYLong的博客 2767

interface陷阱

interface陷阱

qq_38690917的博客 523

大模型知识边界探索:LLM设计的极限测试

最优化理论是数学中的一个分支,主要研究如何从给定的一组约束条件下找到最优解。目标函数:定义了需要优化的指标,可以是最大化或最小化。约束条件:定义了在优化过程中需要满足的限制条件。无约束优化:目标函数和约束条件都不存在。有约束优化:目标函数存在,但存在约束条件。多目标优化:同时需要优化多个目标函数。极限测试(Ultimate Test)是一种系统性的方法,用于评估大型模型(如LLM)在极端条件下的性能和稳定性。极端数据分布:与模型训练数据分布显著不同的数据集。极端计算资源。

AI天才研究院 432

Go语言 nil和interface详解

golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。对此官方有明确的说明:http://pkg.golang.org/pkg/builtin/#T

Sunface撩技术 3537

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

谨慎对待Go语言中对interface的nil判断

谨慎对待Go语言中对interface的nil判断 在进行Go语言编程中,我们会看见诸如if err == nil {}或者if err != nil {}之类的判断,这跟go语言的错误处理哲学(计划失败而非成功 / 及早失败)有关;大多数情况下,我们对一个err是否是nil进行判断是很直白的,无需考虑很多,但是如果对于interface的情况来说,处理的时候稍有点难度,多了许多要留意的地方。 看个重要的例子 package main import ( "bytes" "fmt" "io" ) /

qq_30927019的博客 1026

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Golang-如何判断一个 interface{} 的值是否为 nil ?

Go 会先将 nil 转换为interface (type=nil, data=nil) ,这与 b (type=*string, data=nil) 虽然 data 是一样的,但 type 不相等,因此他们并不相等。进行判断时,其实右边的 nil 并非单纯的是我们所理解的值为nil,而正确的理解应该是 type 为 nil 且 value 也为 nil。当一个 interface 的 type 和 data 都处于 unset 状态的时候,那么该 interface 的类型和值都为 nil。

Ch3nnn的博客 1842

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

golang 接口与nil的判等

在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。 nil不能赋值给结构体,编译时会报错 package main import "fmt" type Man struct{ Name string } var ( man Man == nil man1 *Man ) func main () { fmt.Println("man == nil is ",man =

weixin_45161636的博客 765

接口(Interface)的 Nil 陷阱

Go 的接口是一个带类型的容器。一个空的盒子(Type=nil, Value=nil) 才是nil。一个装着空气的品牌盒子不是nil。

qq_45490502的博客 1170

Golang interface 接口详细原理和使用技巧

Golang interface 接口详细原理和使用技巧 审核中

后端系统和架构 4770

【开发掉坑】go 中 interface 的 nil 判断

今天介绍下 `go` 中的 `interface(any)` 的 `nil` 判断,项目中遇到的一个小问题,知识遗忘了,再做个记录。

DisMisPres的博客 1207

golang interface 与 nil 的比较

Go语言以简单易上手而著称,它的语法非常简单,熟悉C++,Java的开发者只需要很短的时间就可以掌握Go语言的基本用法。interface是Go语言里所提供的非常重要的特性。任何类型只要它提供了Read和Write的绑定函数实现,Go就认为这个类型实现了这个interface(duck-type),而不像Java需要开发者使用implements标明。然而Go语言的interface在使用过程中却有一个特别坑的特性,当你比较一个interface类型的值是否是nil的时候,这是需要特别注意避免的问题。

王仁一的博客 231

[go]空nil与interface中的空指针

介绍了nil的原理与机制,以及不同类型的nil间的区别以及如何真正判断nil

飞鹰技术 1421

golang interface与nil比较的问题

偶然看到一段有意思的代码: package mainimport ( "fmt")type Person struct { name string age int tel string}func main() { var man *Person = nil var ai interface{} = man var ei interface{...

dklg36635的博客 298

golang 面试题(十三)interface内部结构和nil详解

1.以下代码打印出来什么内容,说出为什么。 package main import ( "fmt" ) type People interface { Show() } type Student struct{} func (stu *Student) Show() { } func live() People { var stu *Student return stu } func main() { if live() == nil { fmt.Println("AAAAA

诸君拔剑吧. 1546
上一篇: Golang-interface(一 基本使用)
下一篇: Golang-interface(三 接口类型)
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值