ホームページ >バックエンド開発 >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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。