はのは、私が構造Golangの構造体にメソッドを追加するときに、なぜ変数名を宣言しなければならないのですか?
type Rectangle struct {
length, width int
}
を持っていると私はそれにメソッドを追加したいとしましょう:
func (r Rectangle) Area() int {
return r.length * r.width
}
は、なぜ私はここにそれをr
を変数名を与えなければなりませんか?
はのは、私が構造Golangの構造体にメソッドを追加するときに、なぜ変数名を宣言しなければならないのですか?
type Rectangle struct {
length, width int
}
を持っていると私はそれにメソッドを追加したいとしましょう:
func (r Rectangle) Area() int {
return r.length * r.width
}
は、なぜ私はここにそれをr
を変数名を与えなければなりませんか?
あなたはレシーバ値(Rectangle
値)のフィールドやメソッドを参照したい場合は暗黙の(Javaでthis
のような)実際の受信値を表す識別子、およびがないので、あなたはあなたの識別子を必要とします使える。
この仕様では、受信者の名前に名前を付ける必要はありません。
func (_ Rectangle) Foo() string {
return "foo"
}
あるいはこの:レシーバー名を省略(パラメータ名):スペックから
func (Rectangle) Foo() string {
return "foo"
}
関連セクション:Method declarations:
blank identifierを使用して、次は有効な構文でありますMethodDecl = "func" Receiver MethodName (Function | Signature) . Receiver = Parameters .
パラメータは次のとおりです。
Parameters = "(" [ ParameterList [ "," ] ] ")" . ParameterList = ParameterDecl { "," ParameterDecl } . ParameterDecl = [ IdentifierList ] [ "..." ] Type .
あなたが最後の行で見ることができるように、IdentifierList
は任意である(ただし、Type
が必要です)。
構造体メソッドは、クラスメソッドと同様です。変数 'r'は、メソッドが適用されている構造体/クラスインスタンス/オブジェクトへの参照です。その参照がなければ、その構造体/オブジェクトに含まれるものにアクセスすることはできません。
var smallRectangle = Rectangle{5,3}
は、今私はArea
area := smallRectangle.Area()
は、関数内で何が起こるか見てみましょう長方形の方法を使用して面積を計算したい:
は、例えば貸し付けは、私はあなたの構造体を使用してsmallRectangle
を作成しました。 r
はコピーのsmallRectangle
になります。これはそれを呼び出す構造体オブジェクトです。
func (smallRectangle Rectangle) Area() int {
return smallRectangle.length * smallRectangle.width
}
は、self
又はthis
ような暗黙的な識別子が存在しないので、この方法は、構造体の値にアクセスするための唯一の方法は、識別子r
によるものです。