提供されているコード スニペットに示されているように、異なるタイプのスライスを変換できないのは、特定のタイプの変換が原因です。 Go 仕様で概説されているルール。これらのルールは、非定数値を特定の型に変換できる場合を制御します。
Bar のスライスを Foo のスライスに変換しようとする場合、変換ルールはどれも適用されません。 Foo と Bar の基礎となる型は同一ですが、それぞれのスライスの基礎となる型は同一ではありません。その結果、[]Bar 型の変数に []Foo 値を割り当てることができなくなります。
基礎となる型を理解する
基礎となる型が次のとおりであることに注意することが重要です。変数の型は、変数自体の型と必ずしも同じではありません。スライスの場合、要素の型は基礎となる型です。したがって、Foo と Bar は同じ基礎となる型 (Foo) を持ちますが、[]Foo と []Bar は異なります。
実用的な解決策
この問題に対処するには、Bar を Foo としてエイリアスする中間型を作成できます。このアプローチは、スライスの要素タイプが同じままであるため機能します。例:
<code class="go">type Foo struct { A int } type Bar Foo type Foos []Foo type Bars Foos func main() { foos := []Foo{Foo{1}, Foo{2}} bars := Bars(foos) fmt.Println(bars) }</code>
出力:
[{1} {2}]
このソリューションは、同じ基礎となる要素タイプを持つスライスを作成し、それらの間の変換を可能にします。
安全でない考慮事項
注意事項として、技術的には可能ですが、安全でない操作を使用して Foo のスライスを Bar のスライスとして「表示」します。このアプローチは型安全性を回避します。安全性と信頼性を確保するために、上記で概説した型エイリアス手法を使用することをお勧めします。
以上がGo で異なるタイプのスライスを変換できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。