[解決済み] Goではなぜリストがあまり使われないのですか?
質問
私は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
-
len
と
cap
は実行時に代入可能な変数です。
なぜ
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
.
関連
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 2つのリストを辞書に変換するにはどうしたらいいですか?
-
[解決済み] リスト内の重複を削除する
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] セル配列の各要素を削除する
-
[解決済み] Goではなぜリストがあまり使われないのですか?
-
[解決済み] Merge Sortの最悪のケースはどのような場合に発生するのでしょうか?
-
[解決済み] Bashで配列をソートする方法
-
[解決済み】TypeScriptで複数の型を持つ配列を定義する
-
[解決済み】Swiftで配列をシャッフルするにはどうすればいいですか?
-
[解決済み】KotlinのList型とArray型の違いについて
-
[解決済み] SwiftでArrayの最初の5つのオブジェクトを返すには?
-
[解決済み】配列/配列リストよりリンクリストを使用するのはいつ?
-
[解決済み】mongodbで複数の配列要素を更新する方法