亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类极品videosbest最新版本| 国产精品va在线| 国产亚洲精品va在线观看| 亚洲国内高清视频| 亚洲精品视频免费在线观看| 国产91精品不卡视频| 国产亚洲欧美视频| 精品久久久久久中文字幕一区奶水| 国产成人精品免高潮费视频| 欧美日韩国产区| 中文字幕欧美日韩在线| 国产人妖伪娘一区91| 亚洲夜晚福利在线观看| 国模叶桐国产精品一区| 久久人人爽人人爽人人片av高请| 欧美第一淫aaasss性| 欧美激情视频一区| 精品国偷自产在线视频99| 亚洲欧美国产一区二区三区| 正在播放欧美一区| 综合av色偷偷网| 国产有码在线一区二区视频| 色多多国产成人永久免费网站| 亚洲欧美综合区自拍另类| 久久久精品久久久久| 岛国视频午夜一区免费在线观看| 亚洲japanese制服美女| 在线播放日韩av| 欧美性生交大片免费| 亚洲影院污污.| 久久精品国产亚洲一区二区| 精品国产一区av| 亚洲男人天堂视频| 国产精品狼人色视频一区| 亚洲国模精品私拍| 国产ts人妖一区二区三区| 色综合伊人色综合网| 自拍亚洲一区欧美另类| 亚洲免费电影在线观看| 国产精品极品尤物在线观看| 国产精品丝袜久久久久久高清| 欧美激情视频在线免费观看 欧美视频免费一| 一本久久综合亚洲鲁鲁| 亚洲va欧美va国产综合剧情| 亚洲欧洲av一区二区| 久久久国产精品免费| 日韩资源在线观看| 精品亚洲一区二区| 亚洲aa中文字幕| 国产精品久久综合av爱欲tv| 91精品国产综合久久男男| 久久精品国产亚洲精品| 啪一啪鲁一鲁2019在线视频| 91精品美女在线| 久久久免费精品| 精品国产乱码久久久久久虫虫漫画| 亚洲黄色免费三级| 国产成人亚洲综合| 精品久久久久久久久久久久久| 中文字幕亚洲综合久久筱田步美| 日韩美女免费线视频| 91亚洲精品一区| 成人黄色在线观看| 亚洲激情国产精品| 欧美在线激情视频| 国产精品一区久久| 久久久日本电影| 色偷偷偷亚洲综合网另类| 欧美影院久久久| 成人免费激情视频| 久久久这里只有精品视频| 人人爽久久涩噜噜噜网站| 亚洲欧美国产制服动漫| 中文字幕在线日韩| 日韩av日韩在线观看| 高清欧美性猛交| 精品国产91久久久久久老师| 欧美日韩中文字幕日韩欧美| 另类图片亚洲另类| 欧美日韩亚洲网| 亚洲最大福利视频网站| 欧美与欧洲交xxxx免费观看| 日韩精品在线电影| 中文字幕亚洲色图| 国产亚洲欧洲黄色| 色www亚洲国产张柏芝| 97精品一区二区视频在线观看| 性欧美暴力猛交69hd| 久久综合九色九九| 欧美成人性色生活仑片| 色噜噜狠狠色综合网图区| 亚洲第一区中文99精品| 久久久久久久久久久成人| 欧美成人高清视频| 久久久久国产视频| 国产精品成人品| 青青草原一区二区| 成人免费观看网址| 97国产精品视频人人做人人爱| 中文一区二区视频| 亚洲精品日韩av| 国产69精品久久久久久| 一区二区三区四区精品| 日韩在线观看免费全| 精品国产乱码久久久久久婷婷| 亚洲国产精久久久久久| 国产91网红主播在线观看| 亚洲新声在线观看| 国产精品视频中文字幕91| 国产精品精品一区二区三区午夜版| 日韩美女福利视频| 日韩中文字幕免费| 国产成人精彩在线视频九色| 日韩精品有码在线观看| 97香蕉超级碰碰久久免费软件| 欧美裸体男粗大视频在线观看| 国产成人综合一区二区三区| 中文字幕欧美国内| 精品久久久香蕉免费精品视频| 欧美一级电影久久| 欧美午夜丰满在线18影院| 亚洲qvod图片区电影| 91免费看视频.| 亚洲精品www久久久| 欧美在线视频观看免费网站| 欧美日韩国产限制| 欧美日韩国内自拍| 欧美第一淫aaasss性| 国产精品成人播放| 亚洲一区二区三区xxx视频| 68精品国产免费久久久久久婷婷| 97色在线视频观看| 亚洲精品欧美日韩| 国产99久久精品一区二区 夜夜躁日日躁| 精品国产一区二区三区四区在线观看| 欧美黑人性视频| 狠狠色香婷婷久久亚洲精品| 国产精品第七影院| 姬川优奈aav一区二区| 亚洲色图50p| 国产精品丝袜久久久久久高清| 亚洲综合最新在线| 在线播放国产一区二区三区| 亚洲成人亚洲激情| 国产美女久久精品| 久久6精品影院| 91国产视频在线播放| 亚洲国产精品va在线观看黑人| 欧美黄色成人网| 国产精品成人观看视频国产奇米| 国产色婷婷国产综合在线理论片a| 欧美亚洲一级片| 欧美日韩一区二区三区| 欧美亚洲视频在线观看| 久久久久成人精品| 亚洲综合自拍一区| 欧美性69xxxx肥| 欧美日韩国产黄| 久久久久久国产精品久久| 热久久这里只有精品| 日韩精品极品在线观看播放免费视频| 久久在线免费视频| 欧美激情2020午夜免费观看| xxx成人少妇69|