7

私はこのページでコードを見ています:

http://golang.org/pkg/net/http/

そして、私が理解できないことが 1 つあります。ある時点で、新しい構造が作成され、次のように初期化されます。

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}

&この構造を作成するときに使用する理由

このブログ投稿も読みましたが、構造体は次のように初期化されます。

r := Rectangle{}

両方の違いは何ですか? どちらを使用するかをどのように知る必要がありますか?

4

4 に答える 4

9

違いは、変数の型にあります。

client := &http.Client{

clientタイプで作る*http.Client

その間

client := http.Client{

を構築しhttp.Clientます。

于 2013-02-02T16:58:17.117 に答える
3

一番上のものはポインタを返しています。new を使用する代わりに Go のイディオムです。2 つ目は単なる値オブジェクトです。ポインターが必要な場合は、上部を使用してください。

詳細については、有効な go doc を確認してください

http://golang.org/doc/effective_go.html#allocation_new

于 2013-02-02T16:18:48.393 に答える
3

オブジェクト指向プログラミングでは、オブジェクトが動的な有効期間を持つ (つまり、現在の関数呼び出しに関連付けられていない) ためには、現在のスタック フレーム以外の場所に動的に割り当てる必要があるため、ポインターを介してオブジェクトを操作します。 . これは非常に一般的なパターンであり、Java、Python、Ruby、Objective-C、Smalltalk、JavaScript などを含む多くのオブジェクト指向言語では、オブジェクトへのポインターのみを処理でき、「値としてのオブジェクト」を処理することはできません。自体。(ただし、C++ などの一部の言語では、「オブジェクトを値として」持つことができます。複雑さを追加する RAII イディオムが付属しています。)

Go はオブジェクト指向言語ではありませんが、カスタム型を定義し、そのカスタム型で動作するメソッドを定義する機能は、クラスやメソッドと非常によく似ています。「コンストラクター」関数から型へのポインターを返すと、「オブジェクト」は動的な有効期間を持つことができます。

于 2013-02-03T02:51:25.290 に答える