型別轉換:字串到自訂型別
在Go 中,將字串切片轉換為自訂類型切片可能有挑戰性。考慮以下範例:
package main import "fmt" type Card string type Hand []Card func NewHand(cards []Card) Hand { hand := Hand(cards) return hand } func main() { value := []string{"a", "b", "c"} firstHand := NewHand(value) fmt.Println(firstHand) }
此程式碼將導致編譯器錯誤:
cannot use value (type []string) as type []Card in argument to NewHand
此錯誤的原因在於規範設計決策,以防止不相關類型之間的意外轉換巧合的是,它們具有相同的結構。然而,在某些情況下,可能需要在這些切片之間進行轉換。
不安全轉換
雖然從技術上來說,在具有相同底層類型的切片之間進行轉換並非不可能,安全的方法是複製切片。不過,可以使用不安全的套件執行直接轉換(無需複製):
value := []string{"a", "b", "c"} // convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref cards := *(*[]Card)(unsafe.Pointer(&value)) firstHand := NewHand(cards)
注意
使用不安全的包裝需要非常小心,因為它允許程式繞過類型系統並存取任意記憶體。如果轉換至關重要,建議考慮其他選項,例如定義一個封裝字串和卡片類型的新類型,並在該結構內執行安全轉換。
以上是如何在 Go 中安全地將字串切片轉換為自訂類型切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!