Go struct 對象能比較嗎

同一個struct的兩個實例能不能比較

可能能夠,也可能不能夠。
當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
複製代碼

不一樣struct的兩個實例能不能比較

可能能夠,也可能不能夠。
指針

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是兩個不一樣的實例
複製代碼

struct的實例能作map的key嗎

可能能夠,也可能不能夠。當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
複製代碼

可排序、可比比較、不可比較

  • 可排序:int,float,string
  • 可比較:int,float,string,bool,interface,channel,array
  • 不可比較:slice,map,function

參考

【1】Golang中的struct能不能比較內存

相關文章
相關標籤/搜索