91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中有哪些比較操作符

發布時間:2021-06-17 14:35:29 來源:億速云 閱讀:182 作者:Leah 欄目:編程語言

Golang中有哪些比較操作符,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

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

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

var a int = 1
var 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 = 1
var b int = 2
var c float32 = 3.3
var d float32 = 4.4
fmt.Println(a == b) // false
fmt.Println(c == d) // false

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

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

var a complex64 = 1 + 1i
var b complex64 = 1 + 2i
var c complex64 = 1 + 2i
fmt.Println(a == b) // false
fmt.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 := &a1
p2 := &a2
fmt.Println(p1 == p2) // might be true or false. Don't rely on it!

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

ch2 := make(chan int)
ch3 := make(chan int)
fmt.Println(ch2 == ch3) // 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.T
goroutine 1 [running]:
panic(0x8f060, 0x4201a2030)
  /usr/local/go/src/runtime/panic.go:500 +0x1a1
main.main()
  ...

順序操作符

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

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

結果

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

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

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

var t T = true
var b bool = true
t = b
fmt.Println(t)

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

看完上述內容,你們掌握Golang中有哪些比較操作符的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巍山| 重庆市| 兴文县| 汝南县| 定日县| 德钦县| 华蓥市| 田林县| 濮阳市| 南昌县| 阿拉尔市| 达州市| 宁海县| 上饶市| 甘泉县| 五台县| 松潘县| 南和县| 腾冲县| 台北县| 锦州市| 宜都市| 甘洛县| 聂拉木县| 伊金霍洛旗| 宣武区| 万安县| 连城县| 武平县| 杭州市| 吴江市| 南部县| 辉县市| 利川市| 龙游县| 巴彦淖尔市| 陵水| 海原县| 耒阳市| 大同县| 阿合奇县|