首頁 >後端開發 >Golang >如何在 Go 中安全地將字串切片轉換為自訂類型切片?

如何在 Go 中安全地將字串切片轉換為自訂類型切片?

Barbara Streisand
Barbara Streisand原創
2024-12-09 15:18:15823瀏覽

How Can I Safely Convert a Slice of Strings to a Slice of Custom Types in Go?

型別轉換:字串到自訂型別

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn