Goに「新しい」機能があるのはなぜですか?


49

なぜnewGoに参加したのか、まだ戸惑っています。

構造体をインスタンス化したいときは、

t := Thing{}

すると、新しいインスタンスへのポインタを取得できます

t := &Thing{}

しかし、この可能性もあります:

t := new(Thing)

この最後のものは、他の言語とは少し違うようです。&Thing{}と同じくらい明確で簡潔でnew(Thing)あり、他の場所でよく使用する構成体のみを使用します。また、&Thing{3}またはに 変更する可能性があるため、より拡張可能です&Thing{Feets:7}

私の意見では、補助キーワード1を使用するとコストがかかり、言語がより複雑になり、知っておくべきことが追加されます。そして、構造体のインスタンス化の背後にあるものを、新規参入者に隠すかもしれません。

また、もう1つ予約語を作成します。

それでは、背後にある理由はnew何ですか?それは時々便利ですか?それを使うべきですか?


1:はい、文法レベルではキーワードではないことを知っています。シャドウできますが、合理的な開発者にとって予約語であるという事実は変わりません。


3
「... Go To Coders ...」-これが理由です。F#/ Haskell /など C開発者とは非常に相性が悪いので、トラクションが0になります。Scalaは努力しましたが、今ではより親しみやすく、耳にしています。
デン

12
同じ概念で、PythonとRubyは、Cの開発者にとって非常に異質です。彼らは、なじみのないキーワード、「奇妙な」構文規則(ブレースはどこですか?)、および奇妙なセマンティックコンセプト(ジェネレーター?メタクラス?デコレーター?)を使用しているためです。それでも、彼らは〜0トラクションを取得しません、全く反対。
-Xion

8
@Xion:Rubyの初期成長率を見ましたか?現在の場所(正確には18年)を取得するには長い時間がかかりました。Pythonはさらに古い(1991!)。
ヨアヒムザウアー

2
@AndresF。Scalaに対する抵抗の一部は、言語とは無関係かもしれません。若いプログラマー(25歳)として、名前自体について何かを考えると、Matlabのような数学ベースの言語(私はよく覚えていない)とFortranのような本当に古い言語とのクロスを思い浮かべます。それを見ることさえしたくなかった。
イズカタ

4
サイドノート:newはGoのキーワードではありません。これは組み込み関数です。
マニッシュマリク

回答:


44

質問する最善の方法は、おそらくそれに取り組んでいる人たちです。まさに私がやったこと

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のフィールド}であるはずですが、十分ではありませんでした変更する理由)。

新しい関数は必ずしも必要ではありませんが、実際にはコードで使用されているようです。この時点でそれを取り除くのは難しいです。

イアン


他の「新しいものを維持しましょうか?」へのリンクがあれば嬉しいです。議論随時ポップアップします
デニスセグレ

v := &(0)一時変数を実行およびスキップすることを何か妨げていますか?(Goを知っていません。)
アレックスファインマン

3
@AlexFeinman As 0はリテラル定数なので、そのアドレスを取ることはできません。特定のタイプも必要な場合は、問題が発生します。&intまたはそのような構文&int(0)が有用である理由です(ただし、最適な構文についてはあまり考えませんでした)。しかし、Collinsが示したように2行でそれを行うことも問題ありません(vv := 0; v := &vv)。
デニスセグレ

14
「Go 2まで出せないので」...これは、誰もが知っているように、Go 2有害であると考えられているので決して起こりません。
メイソンウィーラー

2
@MasonWheelerあなたは私を殺しそうになりました...まだ「Go 2が有害だと考えられている」と笑っています...
ダニエラペトルザレク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.