Go がスライス タイプの変換 (例: []Foo から []Bar) を許可しない理由
はじめに
Go では、型安全性と変換ルールのため、通常、1 つの値を別の型の変数に代入することは許可されません。お気づきのように、あるタイプの構造のスライス (例: []Foo) を別のタイプのスライス (例: []Bar) に変換することはできません。この記事は、Foo と Bar の基になる型が同一であるにもかかわらず、この変換が不可能な理由を明確にすることを目的としています。
変換ルール
Go 仕様による、非定数値 x は、次の基準のいずれかが満たされる場合にのみ型 T に変換できます:
スライスの基礎となる型
スライスの基礎となる型は要素型へのポインタです。たとえば、[]Foo の基になる型は []Foo で、[]Bar の基になる型は []Bar です。 Foo の基になる型が Bar の基になる型と同じであっても、Foo と Bar のスライスの基になる型が同じになるわけではありません。
非変換の理由
したがって、基になる型が同じであっても、Go が異なる要素型のスライス間の変換を許可しない理由は、スライスの基になる型が同一ではないためです。その結果、[]Bar(foos) などの型変換は許可されません。
代替解決策
この問題に対する考えられる解決策の 1 つは、次のように定義することです。 Foo のスライスのカスタム タイプ エイリアス (Foos など)。これにより、次のコードに示すように、Foos のスライスから Bars のスライスを作成できます。
<code class="go">type Foo struct{ A int } type Foos []Foo type Bars Foos func main() { foos := []Foo{Foo{1}, Foo{2}} bars := Bars(foos) fmt.Println(bars) }</code>
この場合、Foos と Bars の基礎となる型は同一であり、変換は次のように機能します。
安全でないパッケージに関する考慮事項
Go は通常、安全でない操作を禁止していますが、安全でないパッケージを使用して変換制限を回避することは可能です。ただし、これは型安全性を損なう可能性があるため、潜在的な結果を理解し、注意して行う必要があります。
結論
変換ルールと基礎となるスライスの型を理解することは、 Go で型変換を処理するために重要です。異なる要素型のスライス間の直接変換は許可されていませんが、型の安全性を維持しながら必要な機能を実現するための、カスタム型エイリアスの定義などの代替ソリューションがあります。
以上がGo で「Foo」のスライスを「Bar」のスライスに変換できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。