var a A var b B fmt.Println(a == b) // 编译器报错:invalid operation: a == b (mismatched types A and B)
说明结构体即使字段类型一样,也不能比较。
1 2
c := B(a) fmt.Println(c == b)
结构体和其他类型进行转换时,需要有完全相同的字段(名字、个数和类型)。顺序不同也不能转换。
1 2 3 4 5 6 7 8 9
type A struct { y int x int }
type B struct { x int y int }
即使类型重新定义也不能转换
1 2 3 4 5
type A struct { y int x int } type C A
1 2 3 4 5 6 7 8
var a A var c C //fmt.Println(a == c) 报错:invalid operation: a == c (mismatched types A and C) a = A(c) // a = C(a) 报错:cannot use C(a) (value of type C) as type A in assignment //fmt.Println(a == c) 报错:invalid operation: a == c (mismatched types A and C) a1 := C(a) fmt.Println(c == a1)
方法表达式
将对象的方法函数提取出来,后续执行
1 2 3 4
f1 := u2.changeAge f1(18) // 隐式传递接受者 u2 f2 := u1.changeName f2("xiaoyeshiyu")
func main() { var v Data v.TestValue() v.TestPointer()
var p *Data //p.TestValue() // invalid memory address or nil pointer dereference 此时调用会拷贝p p.TestPointer()
Data{}.TestValue() //Data{}.TestPointer() // cannot call pointer method TestPointer on Data 此时调用会引用底层指针
//(*Data).TestValue(nil) // panic: value method main.Data.TestValue called using nil *Data pointer 此时调用会拷贝对象 (*Data).TestPointer(nil) // 这里不会报错,nil也是一个合法的接收器类型
Data.TestValue(Data{}) //Data.TestPointer(Data{}) cannot call pointer method TestPointer on Data 此时调用会引用底层指针 }