golang---各个类型变量的比较运算

切片

var arr []float32
	fmt.Printf("%p&arr=\n", arr)
	arr = append(arr, []float32{11.0, 22, 12, 24}...)
	fmt.Printf("%parr=\n", arr)

	fmt.Println("&arr=", &arr[0])
	fmt.Println("&arr=", &arr[1])
	fmt.Println("&arr=", &arr[2])
	fmt.Println("&arr=", &arr[3])
	fmt.Printf("%parr=\n", arr)
	var arr2 []float32
	arr2 = append(arr2, []float32{11.0, 22, 12, 24}...)
	fmt.Println("&arr2=", &arr2[0])
	fmt.Println("&arr2=", &arr2[1])
	fmt.Println("&arr2=", &arr2[2])
	fmt.Println("&arr2=", &arr2[3])

	fmt.Println(reflect.DeepEqual(arr, arr2))
	//0x0&arr=
	//	0xc00009e220arr=
	//	&arr= 0xc00009e220
	//&arr= 0xc00009e224
	//&arr= 0xc00009e228
	//&arr= 0xc00009e22c
	//0xc00009e220arr=
	//0xc00000c2e0arr2=
	//	&arr2= 0xc00009e230
	//&arr2= 0xc00009e234
	//&arr2= 0xc00009e238
	//&arr2= 0xc00009e23c
	//true

首先,不能用”==“来比较切片类型的变量,要使用reflect.DeepEqual(),然后arr的地址和arr2的地址不一样,要是按照Java的等于符号老比较,肯定是不相等的,这里使用盖方法比较返回true,也就是它们内容相等,该方法就认为它们是相等的

  1. Boolean(布尔值)、Integer(整型)、Floating-point(浮点数)、Complex(复数)、String(字符)这些类型是毫无疑问可以比较的。
  2. Poniter (指针) 可以比较:如果两个指针指向同一个变量,或者两个指针类型相同且值都为 nil,则它们相等。注意,指向不同的零大小变量的指针可能相等,也可能不相等。
  3. Channel (通道)具有可比性:如果两个通道值是由同一个 make 调用创建的,则它们相等。
 c1 := make(chan int, 2)
 c2 := make(chan int, 2)
 c3 := c1

 fmt.Println(c3 == c1) // true
 fmt.Println(c2 == c1) // false
  1. Interface (接口值)具有可比性:如果两个接口值具有相同的动态类型和相等的动态值,则它们相等。
  2. 当类型 X 的值具有可比性且 X 实现 T 时,非接口类型 X 的值 x 和接口类型 T 的值 t 具有可比性。如果 t 的动态类型与 X 相同且 t 的动态值等于 x,则它们相等。
  3. 如果所有字段都具有可比性,则 struct (结构体值)具有可比性:如果它们对应的非空字段相等,则两个结构体值相等。
    如果 array(数组)元素类型的值是可比较的,则数组值是可比较的:如果它们对应的元素相等,则两个数组值相等。

哪些类型是不可比较的?

slice、map、function 这些是不可以比较的,但是也有特殊情况,那就是当他们值是 nil 时,可以与 nil 进行比较。
编译不通过

	sm1 := struct {
		age int
		m   map[string]string
	}{age: 11, m: map[string]string{"a": "1"}}
	sm2 := struct {
		age int
		m   map[string]string
	}{age: 11, m: map[string]string{"a": "1"}}
	
	if sm1 == sm2 {
		fmt.Println("sm1 == sm2")
	}

我们得出结论:如果我们的变量中包含不可比较类型,或者 interface 类型(它的动态类型可能存在不可比较的情况),那么我们直接运用比较运算符 == ,会引发程序错误。此时应该选用 reflect.DeepEqual 函数(当然也有特殊情况,例如 []byte,可以通过 bytes. Equal 函数进行比较)。

不可比较类型包括 slice、map、function,它们不能使用 == 进行比较。虽然我们可以通过 == 操作符对 interface 进行比较,由于动态类型的存在,如果实现 interface 的 T 有不可比较类型,这将引起运行时错误。
在不能确定 interface 的实现类型的情况下,对 interface 的比较,可以使用 reflect.DeepEqual 函数。
最后,我们通过 json 库的解析与反解析过程中,发现了 json 解析存在数据类型转换操作。
在这里插入图片描述
参考资料

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值