a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Golang > 正文

詳解Go語言中的比較操作符

2020-04-01 18:55:02
字體:
來源:轉載
供稿:網友

這篇文章專注于 6 個操作符,==,!=,<,<=,> 和 >=。我們將深入探討它們的語法和用法的細微差別。對很多人來說,這聽起來不像是吸引人的事,或者他們可能已經從其他編程語言獲得了糟糕的經驗。然而,在 Go 中它們定義的很好并簡潔。下面討論的主題,如可比性將出現在其他場合,如 maps。為了使用上述操作符,至少有一個操作數需要可賦值給第二個操作數:

package mainimport "fmt"type T struct {  name string}func main() {  s := struct{ name string }{"foo"}  t := T{"foo"}  fmt.Println(s == t) // true}

這條規則顯著縮小了可選范圍:

var a int = 1var b rune = '1'fmt.Println(a == b)

類似的代碼在 Javascript 或 Python 中可以運行。但在 Go 中它是非法的,并且在編譯時會被檢測到。

src/github.com/mlowicki/lab/lab.go:8: invalid operation: a == b (mismatched types int and rune)

可賦值不是唯一要求。這是相等和順序操作符的規則……

相等操作符

操作數需要使用 == 或 != 操作符進行比較。哪些方法,哪些值可以被比較?Go 規范定義的非常明確:

boolean 值可比較(如果倆個值都是真或假,那么比較結果被認為 true)
整數和浮點數比較:

var a int = 1var b int = 2var c float32 = 3.3var d float32 = 4.4fmt.Println(a == b) // falsefmt.Println(c == d) // false

當編譯時 a == d 會拋出異常( int 和 float32 類型不匹配)因為它不可能用 int 和 float 比較。

復數相等,如果他們的是實數和虛數部分都相等:

var a complex64 = 1 + 1ivar b complex64 = 1 + 2ivar c complex64 = 1 + 2ifmt.Println(a == b) // falsefmt.Println(b == c) // true

字符串類型值可比較

指針類型值相等,如果他們都是 nil 或都指向相同的變量:

type T struct {  name string}func main() {  t1 := T{"foo"}  t2 := T{"bar"}  p1 := &t1  p2 := &t1  p3 := &t2  fmt.Println(p1 == p2)  // true  fmt.Println(p2 == p3)  // false  fmt.Println(p3 == nil) // false}

不同的 zero-size 變量可能具有相同的內存地址,因此我們不假設任何指向這些變量的指針相等。

a1 := [0]int{}a2 := [0]int{}p1 := &a1p2 := &a2fmt.Println(p1 == p2) // might be true or false. Don't rely on it!

通道類型值相等,如果他們確實一樣(被相同的內置 make 方法創建)或值都是 nil:

ch1 := make(chan int)ch2 := make(chan int)fmt.Println(ch1 == ch2) // false

接口類型是可比較。與通道和指針類型值比較一樣,如果是 nil 或 動態類型和動態值是相同的:

type I interface {  m()}type J interface {  m()}type T struct {  name string}func (T) m() {}type U struct {  name string}func (U) m() {}func main() {  var i1, i2, i3, i4 I  var j1 J  i1 = T{"foo"}  i2 = T{"foo"}  i3 = T{"bar"}  i4 = U{"foo"}  fmt.Println(i1 == i2) // true  fmt.Println(i1 == i3) // false  fmt.Println(i1 == i4) // false  fmt.Println(i1 == j1) // false}

比較接口類型的方法集不能相交。

接口類型 I 的 i 和 非接口類型 T 的 t 可比較,如果 T 實現了 I 則 T 類型的值是可比較的。如果 I 的 動態類型和 T 是相同的,并且 i 的動態值和 t 也是相同的,那么值是相等的:

type I interface {  m()}type T struct{}func (T) m() {}type S struct{}func (S) m() {}func main() {  t := T{}  s := S{}  var i I  i = T{}  fmt.Println(t == i) // true  fmt.Println(s == i) // false}結構類型可比較,所以字段都需要比較。所有非空白字段相等則他們等。a := struct {  name string  _ int32}{name: "foo"}b := struct {  name string  _ int32}{name: "foo"}fmt.Println(a == b) // true

Go 中 數組是同質的 —— 只有同一類型(數組元素類型)的值可以被存儲其中。對于數組值比較,它們的元素類型需要可比較。如果對應的元素相同,數組就相等。

就是這樣。上面列表很長但并不充滿驚奇。嘗試了解它在 JavaScript 是如何工作的……

有三種類型不能比較 —— maps, slices 和 functions。Go 編譯器不允許這樣做,并且編譯比較 maps 的程序會引起一個錯誤 map can only be compared to nil. 。展示的錯誤告訴我們至少可以用 maps,slices 或 functions 和 nil 比較。

目前為止,我們知道接口值是可比較的,但 maps 是不可以的。如果接口值的動態類型是相同的,但是不能比較(如 maps),它會引起一個運行時錯誤:

type T struct {  meta map[string]string}func (T) m() {}func main() {  var i1 I = T{}  var i2 I = T{}  fmt.Println(i1 == i2)}panic: runtime error: comparing uncomparable type main.Tgoroutine 1 [running]:panic(0x8f060, 0x4201a2030)  /usr/local/go/src/runtime/panic.go:500 +0x1a1main.main()  ...

順序操作符

這些操作符只能應用在三種類型:整數,浮點數和字符串類型。這沒有什么特別的或 Go 特有的。值得注意的是字符串是按字典順序排列的。byte-wise 一次一個字節并沒有 Collation 算法。

fmt.Println("aaa" < "b") // truefmt.Println("?" > "z")  // true

結果

任何比較操作符的結果都是無類型布爾常量(true 或 false)。因為它沒有類型,所以可以分配了給任何布爾變量:

var t T = truet = 3.3 < 5fmt.Println(t)

這段代碼輸出 true。另一個,嘗試分配 bool 類型的值:

var t T = truevar b bool = truet = bfmt.Println(t)

產生一個錯誤,不能使用 b (bool類型)分配給 T 類型。

總結

以上所述是小編給大家介紹的Go 語言中的比較操作符,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美亚洲国产一区 | 欧美日韩精品一区二区三区在线观看 | 欧美在线网站 | 污版| 一区二区三区四区在线播放 | 91中文字幕在线观看 | 日本一区视频在线观看 | 久久精品久久久久 | h在线视频| 一区二区视频在线 | 久久99精品久久久久久青青日本 | 天天干干 | 91极品在线 | 久久99精品久久久久久久 | 九一视频在线播放 | 国产免费又色又爽粗视频 | 欧美日韩一二区 | 高清一区二区 | 成人午夜在线观看 | 国产精品国产三级国产专播品爱网 | 天天天综合网 | 国产精品免费观看 | 国产成人专区 | 屁屁影院一区二区三区 | 中文字幕a视频 | 亚洲伊人久久网 | 亚洲九九九 | 国产精品永久免费自在线观看 | 欧美精品一区二区三区在线 | 无码日韩精品一区二区免费 | 色婷婷综合久久久久中文一区二区 | 欧美一区二区三区的 | 亚洲精品麻豆 | 高清一区二区 | 精品国产一区二区三区在线观看 | 久久久久国产视频 | 中文字幕在线不卡 | 久久亚洲一区二区三区四区五区高 | 久久伊人久久 | 日韩欧美在线综合 | 欧美 日韩 国产 一区 |