Golang-从比较到动态类型

-目录-

比较

结构体

结构体的比较,有几个需要注意的地方:

  1. 结构体只能比较是否相等,但是不能比较大小;
  2. 想同类型的结构体才能进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关;
  3. 如果struct的所有成员都可以比较,则该struct就可以通过==或!=进行比较是否相同,比较时逐个项进行比较,如果每一项都相等,则两个结构体才相等,否则不相等;

那有什么是可以比较的呢?

不能比较的有

interface

两个interface比较,需要静态类型相同或其中一个是空interface并且动态类型可比较且相同(comparable and equal)才可以。

对于静态类型来说,需要比较的是他们interface包含的方法,当包含的方法相同时则可以进行下一步的动态类型比较,否则,编译器报错。 注意1,这里不需要他们的名字相同,只需要他们包含的方法相同 注意2,空interface(包括interface{}和没有方法的空interface)是可以进行比较的,编译器不会报错。但此时结果无非就是双方都空true或者任意一方不空false

对于动态类型来说,需要可比较且相同(comparable and equal),如果不可比较则会在运行时panic,如果不相同则false。

package main

import "fmt"

type Person struct {
	first string
	last  string
	age   int
}

type MyEInterface interface {
}

type MyIInterface1 interface {
	Func1()
}

type MyIInterface2 interface {
	Func1()
}

type MyIInterface3 interface {
	Func3()
}

func (p Person) Func1() {

}

func (p Person) Func3() {

}

func main() {
	var e MyEInterface
	var i1 MyIInterface1 = Person{"John", "Doe", 30}
	var i2 MyIInterface1 = Person{"John", "Doe", 32}
	var i3 MyIInterface2 = Person{"John", "Doe", 32}
	//var i4 MyIInterface3 = Person{"John", "Doe", 30}
	var x1 interface{}
	var x2 interface{} = []int{3, 5}
	var x3 interface{} = []int{3, 5}

	a := i1 == i2 //静态类型相同(interface包含方法都为空),动态类型不同 false
	b := x2 == x3 //静态类型相同(interface包含方法都为空),动态类型不能比较 panic
	c := e == x1  //静态类型相同(interface包含方法都为空),动态类型相同(包含数据都为空) true
	d := i2 == i3 //静态类型相同(interface包含方法完全一样),动态类型相同 true
	//f := i2 == i4 //静态类型不同,panic
	g := x1 == i1 //静态类型不同但是其中一个是空interface所以可以比较,动态类型可以比较 false
	h := e == i1  //同上 false
	fmt.Println(a, b, c, d, g, h)
}
© 2019 - 2023 · YuYoung's Blog