Golang Go语言 为什么一个 nil 一个非 nil
关于接口 nil 比较的问题,还是没吃透,有大神帮忙解释解释下面的代码吗?为什么一个 nil 一个非 nil
var a = (*interface{})(nil)
fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
if a == nil {
fmt.Printf("a is nil\n")
}else {
fmt.Printf("a is not nil\n")
}
var val interface{} = (*interface{})(nil)
fmt.Println(reflect.TypeOf(val), reflect.ValueOf(val))
if val == nil {
fmt.Println("val is nil")
} else {
fmt.Println("val is not nil")
}
output
*interface {} <nil>
a is nil
*interface {} <nil>
val is not nil
Golang Go语言我还是有点晕,老司机求带漂移
更多关于Golang Go语言 为什么一个 nil 一个非 nil的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 中 interface 由(type, value)两部分组成
1、对于比较运算符(==), 在 interface 类型( i )和非 interface 类型( ni )比较时,在 i 中的 value 与 ni 的类型相同且 i 的 value 与 ni 的 value 相等时判断为 true。
2、在 interface 与 nil 比较时,需要 interface 的 type,value 皆为 nil 时,==运算符返回 true。
对于:
var a = (interface{})(nil) // a 的类型为interface{}
var b interface{} = (interface{})(nil) // b 的类型为 interface{}, 其中 type =interface{}, value=nil
a == nil // a 为非 interface 类型,a 的值为 nil,返回 true
b == nil // b 的 type 不为 nil,返回 false
a == b // b 的 type 与 a 的类型相同,值相同,返回 true
其中 reflece.Typeof 对于接口类型,返回 interface 的 type, 对于非 interface 类型,返回其类型
详情可看 golang spec。
https://golang.org/ref/spec#Comparison_operators
更多关于Golang Go语言 为什么一个 nil 一个非 nil的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
interface 做比较的时候不只比较值还需要比较类型。
第一个 if 是 nil == nil
第二个 if 是 ( *interface{}, nil ) == ( nil, nil )
清晰明了,终于明白了,感谢
没看一楼之前我都没懂代码里写的啥…
这就是 golang 的特色。。
建议不要起这种标题,没意思。
建议不要起这种标题,没意思。哈哈哈,虽然我看不懂代码
这么复杂的东西都能掌握表示很钦佩。
你好!对于刚开始接触Go语言(Golang)的朋友来说,确实可能会感觉有些晕,不过别担心,这是正常的。作为一位在IT行业摸爬滚打多年的Go语言开发者,我很乐意分享一些经验和技巧,帮助你更快地上手。
首先,建议你先系统地学习Go语言的基础知识,比如变量、数据类型、控制结构等。这些基础知识是后续深入学习的基石。
接下来,你可以通过动手实践来加深对Go语言的理解。尝试编写一些简单的程序,比如“Hello, World!”、斐波那契数列等,这些练习可以帮助你熟悉Go语言的语法和特性。
同时,阅读Go语言的官方文档和源码也是非常重要的。官方文档提供了详细的语言规范和库函数说明,而阅读源码则可以帮助你理解Go语言底层的工作原理和最佳实践。
此外,你还可以加入一些Go语言的社区或论坛,与其他开发者交流心得和解决问题。这不仅可以拓宽你的视野,还可以让你在遇到问题时得到及时的帮助。
最后,保持耐心和持续学习的态度是关键。Go语言是一门非常强大且灵活的编程语言,值得你投入时间和精力去学习。相信只要你坚持下去,一定能够掌握这门语言,并在IT领域取得更大的进步!
希望这些建议对你有所帮助,祝你学习愉快!