18

Go チュートリアルに従っていますが、特定のメソッド シグネチャを理解できないため、行き詰っています。

func (p *Page) save() error {
    filename := p.Title + ".txt"
    return ioutil.WriteFile(filename, p.Body, 0600)
}

ドキュメントでは、これを次のように説明しています。

このメソッドの署名は次のとおりです。

受信機が何かわかりません。これはパラメーターであると読みますが、パラメーターが にあると予想しますsave()

4

2 に答える 2

22

レシーバーはパラメーターの特殊なケースです。Go は、最初のパラメーターをレシーバーとして宣言することにより、メソッドを型にアタッチするための構文糖衣を提供します。

例えば:

func (p *Page) save() error

次のように宣言するのではなく、に an を返す呼び出されたメソッドをアタッチする」とsaveerror*Page読みます。

func save(p *Page) error

これは、「型のパラメータを 1 つ取り、型を返す関数を宣言する」save*Pageerror

それが単なる構文糖衣であることの証明として、次のコードを試すことができます:

p := new(Page)
p.save()
(*Page).save(p)

最後の 2 行は、まったく同じメソッド呼び出しを表しています。

また、この回答を読んでください。

于 2013-07-29T19:45:28.860 に答える
10

レシーバーは、メソッドを宣言するオブジェクトです。

メソッドをオブジェクトに追加する場合は、この構文を使用します。

例: http://play.golang.org/p/5n-N_Ov6Xz

于 2013-07-29T19:42:02.367 に答える