golang中能够用 == 号直接比较的数据类型有如下
整型 integer
、浮点型 float
、字符串 string
、布尔型 boolean
、复数型 complex
、指针型 pointer
、通道型 channel
、接口型 interface
、数组型 array
不能直接比较的
切片型 slice
、键值对型 map
、函数型 func
type S struct {
Name string
Age int
}
func main() {
a := S{
Name: "aa",
Age: 1,
}
b := S{
Name: "aa",
Age: 1,
}
fmt.Println(a == b)
}
struct
的所有成员都可以进行比较,则该struct就可以通过==
或者!=
进行比较是否相等,比较是逐一进行比较,每一项相等才相等slice
,map
或者 func
不能直接比较可以通过reflect.DeepEqual函数进行比较(reflect.DeepEqual(s1, s2))type S1 struct {
s string
i int
}
type S2 struct {
s string
i int
}
func main() {
var s1 S1
var s2 S2
//强制类型转换
//s3 := S1(s2)
//fmt.Println(s3 == s1)//true
s1.s ="zz"
s2.s ="zxp"
s3 := S1(s2)
fmt.Println(s3 == s1)//false
}
不同结构体可以通过强制类型转换来进行比较(前提是不同结构体中的成员顺序是相同的,而且成员个数相同才可以强制类型转换),类型转换后比较方式和相同结构体比较方式是一样的
struct
里面的类型必须是可比较的,才能作为map中的key,不然会报错
p.name
//p.name的底层写法就是(*p).name,这是Go语言帮我们实现的语法糖。
(*p).name
type MyInt1 int
type MyInt2 = int
func main() {
var i int =0
var i1 MyInt1 = i
var i2 MyInt2 = i
fmt.Println(i1,i2)
}
var i1 MyInt1 = i
相当于是将int类型的变量赋值给Myint1类型的变量,是不通过的,MyInt2是int的别名还是int类型。
MyInt1想要赋值需要强制类型转换。
//Student中的S大写可以在包外被访问,若小写只能在本包里被访问
type Student struct {
Name string // S大写的情况下可在包外访问的字段
class string // S大写的情况下仅限包内访问的字段
}