go中型別的相等 及可比較規則

2021-10-19 08:00:08 字數 3779 閱讀 5362

本文主要參考了the go programming language specification中的comparison_operators。加入了自己的一些理解和示例。

如果兩個變數是可比較的(使用==或!=),那它們必可以相互賦值。這意味著可比較的兩個變數必須是同一型別,或者他們的底層型別相同。

可比較可比較

可比較可比較。

可比較可比較。

兩個指標指向同乙個變數,則這兩個指標相等,或者兩個指標同為nil,它們也相等。指標值可以與nil比較。

var num1, num2 int

num1 =

8 num2 =

8 pt1 :=

&num1

pt2 :=

&num1

pt3 :=

&num2

//定義乙個空指標

var pt4 *

int//只有指向同乙個變數,兩個指標才相等

//輸出:true false

fmt.

printf

("%v %v\n"

, pt1 == pt2, pt1 == pt3)

//指標可以與nil直接比較

//輸出:true false

fmt.

printf

("%v %v\n"

, pt4 ==

nil, pt1 ==

nil)

//true false

可比較。

如果兩個通道是由同乙個make建立的,或者兩個通道值都為nil,那麼它們是相等的。

ch1 :=

make

(chan

int)

ch2 :=

make

(chan

int)

var ch3 chan

int ch3 = ch1

var ch4 chan

intvar ch5 chan

intvar ch6 chan

string

//同乙個make建立的通道才相等

//輸出:false true

fmt.

printf

("%v %v\n"

, ch1 == ch2, ch3 == ch1)

//通道值可與nil比較

//輸出:true true

fmt.

printf

("%v %v\n"

, ch4 == ch5, ch5 == ch1)

//兩個不同型別的通道,即使都是空值,也不能比較

//invalid operation: ch5 == ch6 (mismatched types chan int and chan string)

fmt.

printf

("%v\n"

, ch5 == ch6)

可比較。

介面值是乙個兩個字長度的資料結構,如下圖所示。第乙個字包含乙個指向內部表的指標。這個內部表叫作itable,包含了已儲存的值的型別資訊(動態型別)以及與這個值相關聯的一組方法。第二個字是乙個指向所儲存值(動態值)的指標。

如果兩個介面值的動態值和動態型別都相等,或者兩個介面值都為nil,那麼它們是相等的。介面值可以與nil進行比較。

type speaker inte***ce

type person struct

func

(p person)

speak()

type student struct

func

(s student)

speak()

func

main()

p2 := person

p3 := person

s1 := student

fmt.

printf

("%v %v %v %v\n"

,speaker

(p1)

== p2,

speaker

(p1)

==speaker

(p3)

,speaker

(p1)

==speaker

(s1)

,speaker

(s1)

==nil,)

}

如果非介面的型別x的值x與介面型別t的值t滿足:

x本身是可比型別

x實現了t

則兩者的值可以進行比較。如果t的動態型別是x,t動態值與x相同,則t和x相等。

type speaker inte***ce

type person struct

func

(p person)

speak()

type student struct

func

(s student)

speak()

func

main()

p2 := person

p3 := person

s1 := student

//輸出:true false false

fmt.

printf

("%v %v %v\n"

,speaker

(p1)

== p2,

speaker

(p1)

== p3,

speaker

(p1)

== s1,

)}

不可比。只能與nil比較

不可比。只能與nil比較

不可比。只能與nil比較

如果struct中所有的字段都是可比較的,那麼兩個struct是可比較的。如果struct對應的非空白字段相等,則它們相等。struct不能與nil比較。

type person struct

p1 := person

p2 := person

p3 := person

//輸出:false true

fmt.

printf

("%v %v\n"

, p1 == p2, p1 == p3)

var p4 person

var p5 person

//輸出:true

fmt.

printf

("%v\n"

, p4 == p5)

如果陣列中的元素型別是可比的,則陣列也是可比較的。如果陣列中對應的元素都相等,那麼兩個陣列是相等的。陣列不能與nil比較

a1 :=[3

]int

a2 :=[3

]int

a3 :=[3

]int

//元素順序必須一樣

//輸出:true false

fmt.

printf

("%v %v\n"

, a1 == a2, a2 == a3)

//invalid operation: a3 == nil (mismatched types [3]int and nil)

fmt.

printf

("%v\n"

, a3 ==

nil)

go學習筆記 4 比較兩個型別相等

字串比較方法 1 逐個比較且不分大小寫,相等返回true,不相等返回false fmt.println 你好 你好 true fmt.println sa sa true fmt.println sa sa false 2 strings.equalfold 區分utf 8字元在忽略大小寫的情況下是...

java中整數的相等比較

如果比較兩個數值相等的integer型別的整數,你可能會發現,用 比較 首先你必須明確 比較的是位址 有的時候返回true,而有的時候,返回false。比如 integer i 128 integer j 128 system.out.println i j 返回false 而integer m 1...

如果比較表中同型別多列值是否相等?

keylife富翁筆記 作者 hongyuan 標題 如果比較表中同型別多列值是否相等?關鍵字 ttxxhhg 分類 個人專區 密級 公開 評分 回覆 0,閱讀 507 原理 將多列合成一列,分組,如果比較一列 group by 行唯一標識 haing 列數量 table1 a1 a2 a3 a4 ...