可能能够,也可能不能够。
当struct中包含的属性都是可比较类型,则能够。
markdown
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
}
func main(){
var age int = 18
t1 := TestStruct1{
Name: "name1",
Age: &age,
}
t2 := TestStruct1{
Name: "name1",
Age: &age,
}
t3 := &TestStruct1{
Name: "name1",
Age: &age,
}
fmt.Println(t1==t2, t1 == *t3, &t1 == t3)
}
结果:true true false
分析:t1==t2 和 t1 == *t3 都是比较两个struct的内容,因此是true, &t1 == t3 是比较t1,t3两个实例的地址,这是两个不一样的实例,因此地址确定是不同的
复制代码
若是struct中包含不可比较类型的属性,则不可比较oop
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
Friends []string
}
func main(){
var age int = 18
t1 := TestStruct1{
Name: "name1",
Age: &age,
Friends:[]string{"a","b"},
}
t2 := TestStruct1{
Name: "name1",
Age: &age,
Friends:[]string{"a","b"},
}
fmt.Println(t1==t2)
}
fmt.Println(t1==t2) 编译报错:invalid operation: t1 == t2 (struct containing []string cannot be compared)
复制代码
改为:fmt.Println(&t1==&t2),则编译成功,结果是 falsespa
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
Friends []string
}
func main() {
var age int = 18
friends := []string{"a", "b"}
t1 := TestStruct1{
Name: "name1",
Age: &age,
Friends: friends,
}
t2 := TestStruct1{
Name: "name1",
Age: &age,
Friends: friends,
}
t3 := t1
t4 := &t1
fmt.Println(&t1 == &t2, &t1 == &t3, &t1 == t4)
}
结果:false false true
分析:加引用了则比较的是t1和t2两个实例的地址,这是两个实例,地址确定是不同的,因此&t1==&t2的结果是false<br>
这里虽然t3直接用t1赋值,但t3和t1是两个不一样的实例,所以&t1==&t3为false<br>
t4用t1的指针赋值,所以t4和t1指向同一块内存地址,t4的内容是t1的指针,所以&t1==t4结果是true
复制代码
可能能够,也可能不能够。
指针
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
}
type TestStruct2 struct {
Name string
Age *int
}
func main() {
var age int = 18
t1 := TestStruct1{
Name: "name1",
Age: &age,
}
t2 := TestStruct2{
Name: "name1",
Age: &age,
}
fmt.Println(t1 == t2)
}
结果:fmt.Println(t1 == t2)报编译错误:invalid operation: t1 == t2 (mismatched types TestStruct1 and TestStruct2)
分析:t1和t2两个实例的结构体不同,确定不能比较
复制代码
两个struct不同的结构体的实例不能直接比较,可是能够经过强制类型转换进行比较code
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
}
type TestStruct2 struct {
Name string
Age *int
}
func main() {
var age int = 18
t1 := TestStruct1{
Name: "name1",
Age: &age,
}
t2 := TestStruct2{
Name: "name1",
Age: &age,
}
fmt.Println(t1 == TestStruct1(t2))
fmt.Println(TestStruct2(t1) == t2)
}
结果:true true
分析:虽然t1,t2是两个不一样的结构体,可是经过强制类型转换成一个结构体,也是能够比较的,而且结果是true
复制代码
可是若是两个结构体中包含不可比较类型的属性,则不能比较orm
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
Friends []string
}
type TestStruct2 struct {
Name string
Age *int
Friends []string
}
func main() {
var age int = 18
friends := []string{"a","b"}
t1 := TestStruct1{
Name: "name1",
Age: &age,
Friends:friends,
}
t2 := TestStruct2{
Name: "name1",
Age: &age,
Friends:friends,
}
t3 := TestStruct1(t2)
fmt.Println(t1 == t3)
}
结果:fmt.Println(t1 == t3)编译错误:invalid operation: t1 == t3 (struct containing []string cannot be compared)
分析:虽然t2能够强制转换成TestStruct1类型,可是仍是不能与t1比较。
能够取地址比较:fmt.Println(&t1==&t3),结果是false,由于t1和t3是两个不一样的实例
复制代码
可能能够,也可能不能够。当key是可比较的时候则能够,不然不能够排序
package main
import "fmt"
type TestStruct1 struct {
Name string
Age *int
}
type TestStruct2 struct {
Name string
Age *int
Friends []string
}
func main() {
m1 := make(map[TestStruct1]string)
m2 := make(map[TestStruct2]string)
fmt.Println(m1,m2)
}
结果:m2 := make(map[TestStruct2]string)编译错误:invalid map key type TestStruct2
复制代码
【1】Golang中的struct能不能比较内存