網頁

2022/6/25

Golang 可比較相等型態 equality comparable types

Go可比較是否相等的型態如下。


所謂可比較是否相等(equality comparison)是指能以比較相等運算符==及不等運算符!=比較兩個型態值是否相同。以下型態可用==!=進行比較。

  • 布林 Boolean - bool
  • 整數 Integer - intint8int16int32int64uintuint8uint16uint32uint64
  • 浮點數 Floating-point - float32float64
  • 複數 Complex - complex64complex128
  • 字串 String - string
  • 指標 Pointer - *T
  • 併發通道 Channel - chan
  • 介面 Interface - interface。實作型態必須是comparable。
  • 結構 Struct - struct。所有的欄位必須是comparable。
  • 陣列 Array - 所有的元素必須是comparable

main.go

package main

import (
    "fmt"
)

type Worker interface {
    Work()
}
type Employee struct {
    ID   int64
    Name string
    Age  int
}

func (e Employee) Work() {
    fmt.Printf("%s is working", e.Name)
}

type Manager struct {
    ID   int64
    Name string
}

func (m Manager) Work() {
    fmt.Printf("%s is working", m.Name)
}

func main() {
    b1 := true
    b2 := true
    fmt.Println(b1 == b2) // true

    i1 := 10
    i2 := 10
    fmt.Println(i1 == i2) // true

    f1 := 9.99
    f2 := 9.99
    fmt.Println(f1 == f2) // true

    c1 := complex(0.1, 0.1)
    c2 := complex(0.1, 0.1)
    fmt.Println(c1 == c2) // true

    s1 := "hello"
    s2 := "hello"
    fmt.Println(s1 == s2) // true

    p1 := &s1
    p2 := &s2
    fmt.Println(p1 == p2) // false

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

    var w1, w2 Worker
    w1 = Employee{ID: 1, Name: "John"}
    w2 = Manager{ID: 1, Name: "John"}
    fmt.Println(w1 == w2) // false

    emp1 := Employee{ID: 1, Name: "John", Age: 33}
    emp2 := Employee{ID: 1, Name: "John", Age: 33}
    fmt.Println(emp1 == emp2) // true

    a1 := [3]int{1, 2, 3}
    a2 := [3]int{1, 2, 3}
    fmt.Println(a1 == a2) // true
}

至於map、slice及function則是不可比較的(not comparable),也就是無法用==!=進行比較,編譯時會出現錯誤。



沒有留言:

張貼留言