ホームページ > バックエンド開発 > Golang > Go で文字列のスライスをカスタム型のスライスに安全に変換するにはどうすればよいですか?

Go で文字列のスライスをカスタム型のスライスに安全に変換するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-09 15:18:15
オリジナル
854 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート