Golang - Comma-ok

GoLang - Comma-ok 斷言

在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對介面 Comma-ok 斷言 進行說明

在 Go 語言沒有其他語言常見的 try catch,因此,在錯誤處理需要透過幾種方式來進行。

在這裡要說明的 comma-ok 是用在型別檢查,當型別錯誤,可避免直接導致運行錯誤。

基本結構如下,這裡的 vaule 表示為檢查成功會取得該元素,ok 型別為布林值,T 表示的是動態型別,element 表示為要被檢查的元素:

value, ok := element.(T)

例如,在這裡我們定義一個變數為 interface 型別,並且賦予數值,再透過 comma-ok 檢查型別是否為 int:

import "fmt"

var DataObj interface{}

func main() {
    DataObj = 10
    value, ok := DataObj.(int)
    if ok {
        fmt.Println("ok", value)
    } else {
        fmt.Println("error type")
    }
}

//output ok 10

接著,把型別修改為 string ,再次運行

import "fmt"

var DataObj interface{}

func main() {
    DataObj = 10
    value, ok := DataObj.(string)
    if ok {
        fmt.Println("ok", value)
    } else {
        fmt.Println("error type")
    }
}

//error type

在 Go 語言的 comma-ok 也省略掉 ok,但是要留意若失敗時,會造成 panic

value := element.(T)

Switch 測試:

通常,使用簡潔的方式,會搭配 switch 測試的方式,做共同應用,就能將 comma-ok 用 switch 測試的方式更簡單的進行檢查。

# command-line-arguments
import "fmt"

func JudgeType(DataObj interface{}) {
    switch value := DataObj.(type) {
    case nil:
        fmt.Println("Type is nil")
    case int:
        fmt.Println("int:", value)
    case string:
        fmt.Println("string:", value)
    default:
        fmt.Println("no match")
    }
}

func main() {
    n := 10
    JudgeType(n)

    a := "hello"
    JudgeType(a)
}

在一般較為常見用法,是透過 error 來捕捉錯誤,以及透過 defer 做收尾,最後關閉連線或檔案,例如:

func writeNote() (err error) {

    var f *os.File
    f, err = os.Create("data.txt")

    if err != nil {
        return
    }

    defer func() {
        cerr := f.Close()
        if err == nil {
            err = cerr
        }
    }()

    err = io.WriteString(f, "hello note")
    return
}

在 GoLang 的reflect也可以用來判斷型別,會在陸續介紹到。