型変換: 文字列からカスタム型へ
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 中国語 Web サイトの他の関連記事を参照してください。