· 2 分鐘閱讀
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.")
}
}
到這邊,有兩個地方需要注意:
- 如果沒有第二個回傳值,除非你很確定型別,不然程式有可能因為斷定失敗而導致 panic
- 加入第二個回傳值後,不會造成
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 啦,但一不小心可能還是會落入陷阱。
相關文章
- 當測量變成目標:從窗戶稅到 Pull Request 數 我曾寫小工具統計自己一季貢獻了多少 PR、留了多少 review、解了多少 ticket,想拿數字向主管證明產出。主管只淡淡說績效不只看產出。幾年後我才懂——當測量變成目標,它就不再是一個好的測量了。從英國窗戶稅、河內滅鼠賞金,到今天用 PR 數評估開發者,機制一模一樣。
- 用 Cloudflare Images 當作圖片儲存、轉檔方案 在網頁放一張圖片是前端最簡單的事,但要把它做完整,包含縮放、生出各種格式、還要擋住流量,其實是一整個解決方案。我後來一律交給 Cloudflare Images,只留一份原圖給它。
- 別再用 AWS Access Key 了 Access Key 是 AWS 上容易被忽略的安全風險。用 OIDC 搭配 IAM Role,讓 GitHub Actions 不需要任何 secret 就能安全操作 AWS 資源
- 資料庫主鍵:AUTO_INCREMENT、UUID 與 UUIDv7 後端開發常需要決定主鍵,要用 auto increment 還是 UUID?碰撞怎麼辦?UUIDv7 跟 created_at + index 的效能差多少?實際跑了 2000 萬筆資料與設計決策告訴你