Kalan's Blog

Kalan 頭像照片,在淡水拍攝,淺藍背景

四零二曜日電子報上線啦!訂閱訂起來

本部落主要是關於前端、軟體開發以及我在日本的生活,也會寫一些對時事的觀察和雜感
本部落格支援 RSS feed(全文章內容),可點擊下方 RSS 連結或透過第三方服務設定。若技術文章裡有程式碼語法等特殊樣式,仍建議至原網站瀏覽以獲得最佳體驗。

目前主題 亮色

我會把一些不成文的筆記或是最近的生活雜感放在短筆記,如果有興趣的話可以來看看唷!

Golang 筆記 — Type Assertion

golang 當中,對於 interface{} 的型別,你可以做型別斷定,來假設這個 interface 是某個型別,這樣一來你就可以操作這個型別中的方法。

var i interface{} = "hello"
s := i.(string)
fmt.Println(s)

這段程式碼可以將原本的 interface{} 斷定為字串。

不過要特別注意的是,如果這個型別並不是字串的話,這段程式碼會直接 panic。

args := []interface{}{
		1,
		"1",
		"2",
	}
for _, arg := args {
  val := arg.(int) // interface conversion: interface {} is string, not int
  fmt.Println(val)
}

golang 提供了一個機制,型別斷定會回傳兩個數字,一個是轉換後的數字,另外一個是這個斷定是否正確。

args := []interface{}{
		1,
		"1",
		"2",
	}
for _, arg := args {
  if val, ok := arg.(int); ok {
    fmt.Println(val)    
  } else {
    fmt.Println("not int.")
  }
}

到這邊,有兩個地方需要注意:

  1. 如果沒有第二個回傳值,除非你很確定型別,不然程式有可能因為斷定失敗而導致 panic
  2. 加入第二個回傳值後,不會造成 panic

雖然麻煩一些,但還是總是做型別轉換比較保守一點。

另外要注意的一點是,斷定失敗後的 val 會是你斷定型別的 zero-value。

斷定失敗後的 val 會是你斷定型別的 zero-value。

for _, arg := range args {
  if val, ok := arg.(int); ok {
    fmt.Println(val, ok) // 1, true
  } else {
    fmt.Println(val, ok) // 0 , false
    // 0, false
  }
}

一般來講斷定失敗後,是不常用到這個 value 啦,但一不小心可能還是會落入陷阱。

上一篇

Goworker 簡介 — 搭配 Redis 實作 worker

下一篇

如何搜集並集中 golang 應用中的 Log

如果覺得這篇文章對你有幫助的話,可以考慮到下面的連結請我喝一杯 ☕️ 可以讓我平凡的一天變得閃閃發光 ✨

Buy me a coffee