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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 14:36:12907ブラウズ

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

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