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也可以用來判斷型別,會在陸續介紹到。