Go 中的命名類型斷言與轉換
在Go 中定義自訂類型時,可以使用新名稱重新定義預定義類型。但是,當嘗試在需要預定義類型的函數中使用這些自訂類型時,可能會發生錯誤。讓我們深入研究這些錯誤背後的原因並探討解決方案。
考慮以下程式碼:
<code class="go">type Answer string func acceptMe(str string) { fmt.Println(str) } func main() { var ans Answer = "hello" // Cannot use ans (type Answer) as type string in function argument acceptMe(ans) // Invalid type assertion: ans.(string) (non-interface type Answer on left) acceptMe(ans.(string)) // Works, but why? acceptMe(string(ans)) }</code>
為何類型斷言失敗
類型斷言只適用於介面。介面可以有任何底層類型,允許類型斷言或類型切換。但是,在本例中,Answer 是具有單一基礎類型字串的自訂類型。不需要型別斷言,因為到基礎型別的轉換保證會成功。
為什麼轉換有效
另一方面,可以執行轉換具有已知關係的類型之間,例如 Answer 和 string 的情況。語法 string(ans) 明確地將 Answer 類型轉換為基礎字串類型。
結論
理解類型斷言和轉換之間的區別非常重要。類型斷言應與介面一起使用以動態檢查底層類型。另一方面,轉換用於在具有已知關係的類型之間明確轉換。對於答案和字串,轉換是推薦的方法,因為它提供了一種可預測且清晰的方式來與底層類型進行互通。
以上是為什麼 Go 中的自訂類型類型斷言失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!