亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 Golang 中向結構體添加方法時必須聲明變量名?

為什么在 Golang 中向結構體添加方法時必須聲明變量名?

Go
郎朗坤 2021-12-27 15:31:25
假設我有一個結構type Rectangle struct {    length, width int}我想給它添加一個方法:func (r Rectangle) Area() int {    return r.length * r.width}為什么我必須在這里給它一個變量名r?
查看完整描述

2 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

因為沒有隱式標識符來表示實際的接收者值(就像this在 Java 中一樣),如果你想引用接收者值 ( Rectanglevalue)的字段或方法,你需要一個可以使用的標識符。


請注意,規范不要求您命名接收器值,例如以下使用空白標識符的語法是有效的:


func (_ Rectangle) Foo() string {

    return "foo"

}

甚至這樣:省略接收者名稱(參數名稱):


func (Rectangle) Foo() string {

    return "foo"

}

規范中的相關部分:方法聲明:


MethodDecl   = "func" Receiver MethodName ( Function | Signature ) .

Receiver     = Parameters .

其中參數是:


Parameters     = "(" [ ParameterList [ "," ] ] ")" .

ParameterList  = ParameterDecl { "," ParameterDecl } .

ParameterDecl  = [ IdentifierList ] [ "..." ] Type .

正如您在最后一行中看到的,IdentifierList是可選的(但Type必需的)。


查看完整回答
反對 回復 2021-12-27
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

結構方法類似于類方法。變量“r”是對該方法所應用到的結構/類實例/對象的引用。如果沒有該引用,您將無法訪問該結構/對象中包含的任何內容。


例如,我smallRectangle使用您的結構創建:


var smallRectangle = Rectangle{5,3}

現在我想使用 Rectangle 方法計算面積 Area


area := smallRectangle.Area()

讓我們看看函數內部發生了什么。r從方法聲明變成的副本,smallRectangle因為那是調用它的結構對象。


func (smallRectangle Rectangle) Area() int {

    return smallRectangle.length * smallRectangle.width

}

正如 Icza 所指出的,沒有像selforthis這樣的隱式標識符,因此該方法訪問結構值的唯一方法是通過 identifier r。


查看完整回答
反對 回復 2021-12-27
  • 2 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號