Go中的nil和interface
在对Go-Micro库改造中,碰到了一个nil与interface比较的问题。现象是我返回的接口是nil,返回值是另一个接口接收,在函数外,与nil进行比较,其竟然不为nil。
代码:
1 | type Err struct { |
变体:
1 | func Foo() error { |
以上两种情况,都有一个共同的操作,就是将一个接口(值为nil),赋值给另一个接口。
出现此问题的原因,还是在于interface本身的结构中。(帮助大家了解: Go语言interface底层实现 、 Go Interface 源码剖析)
关于nil的讲解:https://speakerdeck.com/campoy/understanding-nil?slide=50
interface由两部分组成:(type, value)。
1 | var s fmt.Stringer // Stringer (nil, nil) |
两个成员为(nil, nil),才等于nil。
1 | var p *Person // nil of type *Person |
interface的值为:(*Person, nil),不等于nil。
注意:在编程中,接口赋值给另一个接口,需要注意nil的情况,如果可以,就尽可能避免这种情况。
本文标题:Go中的nil和interface
文章作者:小师
发布时间:2020-12-03
最后更新:2022-05-04
原始链接:chunlife.top/2020/12/03/Go中的nil和interface/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可