「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で異なるタイプのスライスを変換できないのはなぜですか?

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

2024 年 11 月 16 日に公開
ブラウズ:472

Why Can\'t You Convert Slices of Different Types in Go?

スライス タイプを変換できないのはなぜですか?

提供されているコード スニペットに示されているように、異なるタイプのスライスを変換できないのは、特定のタイプの変換が原因です。 Go 仕様で概説されているルール。これらのルールは、非定数値を特定の型に変換できる場合を制御します。

Bar のスライスを Foo のスライスに変換しようとする場合には、どの変換ルールも適用されません。 Foo と Bar の基礎となる型は同一ですが、それぞれのスライスの基礎となる型は同一ではありません。その結果、[]Bar 型の変数に []Foo 値を割り当てることができなくなります。

基礎となる型を理解する

基礎となる型に注意することが重要です。変数の型は、変数自体の型と必ずしも同じではありません。スライスの場合、要素の型は基礎となる型です。したがって、Foo と Bar は同じ基礎となる型 (Foo) を持ちますが、[]Foo と []Bar は異なります。

実際的な解決策

この問題に対処するにはを使用すると、Bar を Foo としてエイリアスする中間型を作成できます。このアプローチは、スライスの要素タイプが同じままであるため機能します。例:

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)
}

出力:

[{1} {2}]

このソリューションは、同じ基礎となる要素タイプを持つスライスを作成し、それらの間の変換を可能にします。

安全でない考慮事項

注意事項として、安全でない操作を使用して Foo のスライスを Bar のスライスとして「表示」することは技術的には可能ですが、このアプローチは型安全性を回避します。安全性と信頼性を確保するために、上記で概説した型エイリアス手法を使用することをお勧めします。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3