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
,它们不应该相等吗?