質問する最善の方法は、おそらくそれに取り組んでいる人たちです。まさに私がやったこと!
Tl; dr:それはもともととの前にmake
ありましたが&{}
、それでもいくつかの状況で使用する関数です。
基本的に、引用される最も重要な部分は次のとおりです。
それでは、新しい背後にある理由は何ですか?それは何か有用ですか?それを使うべきですか?
あなたはこれなしでこれを行うことはできません
v := new(int)
*v++
fmt.Println(*v)
newはGoのヘッドライン機能ではありません。頻繁に使用されることはありませんが、必要な場合はそこにあります。
乾杯
デイブ
この種の解決策を示す別の回答の後:
vv := 0
v := &vv
*v++
fmt.Println(*v)
私はさらなる説明を求めました:
だから基本的に、デイブのポイントは本当に立っていないのですか?
アドレスを取得するためだけに新しい変数に忍び込むのは不便なところがあります。
new(T)は、マルチステップのイディオムではなく、すぐにわかりやすい意味を持ちます。
Daveのポイントは、単なる技術的可能性(なしで行うことnew
)が単独で説得力がある場合にのみ低下し
ます。
ほぼすべての言語にGoがあるためGoが持っている必要があることは明らかだったので、これについては議論しませんでしたか?
「私たちは守りnew
ましょうか?」議論は時々ポップアップします。約束を正しく理解していれば、Go 2までそれを取り出すことができないので、再びループを回るのに多くのことはないようです。Go 2が考えられる頃には、いくつかの異なるより良いアイデアがあるかもしれません...
クリス
また、主に歴史的な理由でそこにあります:
プロジェクトの履歴を考慮する必要があります。makeが行われる前に、新しいものが最初に導入されると思います。
それは本当です。実際、私たちはmakeのアイデアを思いつく前にしばらく苦労しました。リポジトリログを見ると、2009年1月のリビジョン9a924177598fにのみmakeが表示されていることがわかります。
新しい組み込み関数は、複合リテラルのアドレスを取得するための&{}のアイデアにも先行していました(そして、その構文はある意味間違っています。おそらく(* T){Tのフィールド}であるはずですが、十分ではありませんでした変更する理由)。
新しい関数は必ずしも必要ではありませんが、実際にはコードで使用されているようです。この時点でそれを取り除くのは難しいです。
イアン