Golang中的传递性质
在我看来,这段代码很不直观:Golang中的传递性质,go,equality,Go,Equality,在我看来,这段代码很不直观: var first *byte var second interface{} fmt.Println(first, first == nil) // <nil> true fmt.Println(second, second == nil) // <nil> true fmt.Println(first == second) // false var第一个*字节 var第二接口{} fmt.Prin
var first *byte
var second interface{}
fmt.Println(first, first == nil) // <nil> true
fmt.Println(second, second == nil) // <nil> true
fmt.Println(first == second) // false
var第一个*字节
var第二接口{}
fmt.Println(first,first==nil)//true
fmt.Println(秒,秒==nil)//真
fmt.Println(first==second)//false
据我所知,第一个变量是指向类型为byte
的空变量的指针,而第二个变量是空接口。因此,由于变量的类型不同,因此不认为它们相等
但如果它们彼此不相等,它们怎么能等于第三个值呢?在编程语言中,当传递定律不成立时,这是常见的情况吗?标识符
nil
表示通道、指针、接口、函数、映射和切片类型的类型
*字节的零值不等于接口{}
Nil的零值,但go中的每个值也有一个类型
在测试方法返回自定义错误类型为err
时,我也看到了类似的情况,然后检查错误是否相等,失败的原因是Go本质上认为它们不同,因为您没有将其类型声明为自定义错误类型。下面是Go的==运算符不及物性的一个更有趣的示例。它不依赖于零;对于函数和映射之类的类型,最好将x==nil看作一个特殊运算符,因为这些类型的值彼此不可比较
//“你好!”x==s==“你好”
func main(){
键入S字符串
var s=“你好”
var x接口{}=s
fmt.Println(s==“hello”)//s==“hello”
fmt.Println(x==s)//x==s
fmt.Println(x==“你好”)//x!=“你好”
}
解释这种异常现象的一种方法是,这里实际上有两个不同的相等运算符在工作。第一个比较具有类型S,但第二个和第三个比较具有类型接口{}。删除类型后,接口转换将显式进行,并且每个“==”将替换为相应类型的比较运算符。这些比较运算符各自是真正的等价关系,也就是说它们是可传递的。nil
是一个特殊值,不要将逻辑建立在它之上。另请参阅。请参阅可能的副本。也感谢您提供了一个很好的示例。请您澄清为什么第三个语句是x==“hello”
是false?根据规范如果一个操作数是非类型常量,而另一个操作数不是,则该常量将转换为另一个操作数的类型。
如果我们将字符串常量hello
转换为x
,它们不应该相等吗?