ホームページ > バックエンド開発 > Golang > Go で異なるタイプのスライス間を直接変換できないのはなぜですか?

Go で異なるタイプのスライス間を直接変換できないのはなぜですか?

Linda Hamilton
リリース: 2024-12-03 14:36:12
オリジナル
767 人が閲覧しました

Why Can't I Directly Convert Between Slices of Different Types in Go?

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)
}
ログイン後にコピー

[]string と []Card は類似しているにもかかわらず、コンパイラはエラーを報告します:

cannot use value (type []string) as type []Card in argument to NewHand
ログイン後にコピー

根拠

Go の仕様では、関連のない型間の偶発的な型変換を防ぐために、この変換を禁止しています。

解決策

  • セーフ コピー: 推奨されるアプローチは、スライスの内容を必要なタイプ。
  • 安全でないポインタ変換(安全ではありません): この手法は型システムをバイパスし、安全でないパッケージを使用した直接変換を可能にしますが、使用には注意が必要です。
value := []string{"a", "b", "c"}
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)
ログイン後にコピー

以上がGo で異なるタイプのスライス間を直接変換できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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