1. ホーム
  2. arrays

[解決済み] Goではなぜリストがあまり使われないのですか?

2022-03-04 05:25:26

質問

私はGoの初心者で、かなり興奮しています。しかし、私がこれまで幅広く扱ってきたすべての言語において、Go は、そのような言語ではありません。Delphi、C#、C++、Python - 配列とは対照的に、リストは動的にサイズを変更することができるので、非常に重要です。

Golangでは、確かに list.List 構造体に関するドキュメントはほとんど見当たりません。 例で見る 私が持っている3冊のGo本、Summerfield、Chisnal、Balbaertは、どれも配列とスライスに多くの時間を費やし、マップの話に飛んでしまいます。ソースコードの例を見ても、私は list.List .

また、Pythonとは異なり、「? Range はListではサポートされていません - 大きな欠点だと思います。私は何かを見逃しているのでしょうか?

スライスは確かに素晴らしいですが、それでもハードコードされたサイズを持つ配列に基づく必要があります。そこで、Listの出番です。ハードコードされた配列サイズなしで、Goで配列/スライスを作成する方法はありますか?なぜListは無視されるのですか?

解決方法は?

この質問をしたのは数ヶ月前、私が初めてGoについて調べ始めたときでした。それ以来、毎日、囲碁について読んだり、囲碁でコーディングしたりしています。

この質問に対して明確な回答が得られなかったので(ある回答は受け入れていたのですが)、この質問をしてから学んだことを踏まえて、私なりに回答してみます。

<ブロッククオート

Goで配列/スライスをハードコードせずに作成する方法はありますか? 配列のサイズを教えてください。

はい、スライスでは、ハードコードされた配列は必要ありません。 slice からのものです。

var sl []int = make([]int, len, cap)

このコードでは、スライスの割り当て sl の、サイズ len の容量で cap - lencap は実行時に代入可能な変数です。

なぜ list.List は無視されるのですか?

主な理由は以下のようです。 list.List は、Goではあまり注目されていないようです。

  • Nick Craig-Wood氏の回答で説明されているように リストでできて、リストでできないことはほとんどない。 スライスで、より効率的に、よりきれいに、より多く エレガントな構文です。例えば、範囲構成です。

     for i := range sl {
       sl[i] = i
     }
    
    

    はリストと一緒に使うことはできません。C言語スタイルのforループが必要です。また 多くの場合、C++のコレクションスタイルの構文をリストで使用する必要があります。 push_back などです。

  • おそらくもっと重要なことです。 list.List Pythonのリストやディクショナリーと非常によく似ていて、コレクションの中で様々な型を混在させることができます。これは というのが、Goのアプローチです。Goは非常に強く型付けされた言語です。例えば、Goでは暗黙の型変換は決して許されませんし、upCastでも int から int64 が必要です。 を明示します。しかし、list.Listのすべてのメソッドは空のインターフェイスを取ります。 何でもありです。

    私がPythonを捨ててGoに移行した理由の1つは Pythonの型システムのこのような弱点について、Pythonは、しかし 強く型付けされていると主張しています(IMOではそうではありません)。Goの list.List のようです。 は、C++の「quot;mongrel"」から生まれた一種の雑種である。 vector<T> とPythonの List() であり、Go 自体には少しそぐわないかもしれません。

遠くない将来のある時点で、Go で list.List が非推奨になったとしても、私は驚きません。 珍しい 良いデザインプラクティスを用いても、様々な型を保持するコレクションで問題を解決するのがベストであるような状況。あるいは、C言語ファミリーの開発者が、Goに特有のスライスのニュアンスを学ぶ前に、Goに慣れるための橋渡しをするためにあるのかもしれません(AFAIK)。(ある点では、スライスは C++ や Delphi のストリーム クラスに似ていますが、完全ではありません。)

Delphi/C++/Pythonのバックグラウンドを持つ私ですが、最初にGoに触れたとき、私は次のように感じました。 list.List の方が、Goのスライスよりも馴染みやすいのですが、Goに慣れるにつれて、すべてのリストをスライスに変更しました。まだ、以下のようなものは見つかっていません。 slice または map を使用する必要があります。 list.List .