Golang-从比较到动态类型
-目录-
比较
结构体
结构体的比较,有几个需要注意的地方:
- 结构体只能比较是否相等,但是不能比较大小;
- 想同类型的结构体才能进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关;
- 如果struct的所有成员都可以比较,则该struct就可以通过==或!=进行比较是否相同,比较时逐个项进行比较,如果每一项都相等,则两个结构体才相等,否则不相等;
那有什么是可以比较的呢?
- 常见的有bool、数值型、字符、指针、数组等,同时注意数组需要大小相同,否则还是不能比较
不能比较的有
- slice、map、函数
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)
}