数か月前、Goの調査を始めたときに、この質問をしました。それ以来、私は毎日Goについて読み、Goでコーディングしています。
この質問に対する明確な回答を受け取っていなかったため(1つの回答を受け入れましたが)、質問してから学んだことに基づいて、自分で回答します。
ハードコードされた配列サイズなしで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では暗黙的な型変換は許可されint
ていint64
ません。upCastfromからtoまでは明示的である必要があります。しかし、list.Listのすべてのメソッドは、空のインターフェイスを取ります-何でもできます。
私がPythonを放棄してGoに移行した理由の1つは、Pythonが「強く型付けされている」と主張しているにもかかわらず、Pythonの型システムにこの種の弱点があるためです(IMOはそうではありません)。Golist.List
は、C ++vector<T>
とPythonから生まれた一種の「雑種」のよう
List()
であり、Go自体ではおそらく少しずれています。
それほど遠くない将来のある時点で、リストが見つかったとしても、私は驚かないでしょう。Goで非推奨になったリストは、おそらく残るでしょうが、それらのまれなものに対応するためです優れた設計手法を使用しても問題を最もよく解決できるという状況さまざまなタイプを保持するコレクションを備えています。あるいは、Cファミリーの開発者が、Go、AFAIKに固有のスライスのニュアンスを学ぶ前に、Goに慣れるための「ブリッジ」を提供することもできます。(いくつかの点で、スライスはC ++またはDelphiのストリームクラスに似ているように見えますが、完全ではありません。)
Delphi / C ++ / Pythonのバックグラウンドから来ましたが、Goに最初に触れたとき、Goにlist.List
慣れてきたので、Goのスライスよりも慣れていることがわかりました。戻って、すべてのリストをスライスに変更しました。を使用する必要があるため、まだ何も見つからないかslice
、map
許可されていませんlist.List
。
list
タイプは、リンクリストを使用して実装されていないことに注意してください。これは、Goスライスと同様に動作し、場合によってはデータコピーを展開する必要があります。