為什麼可以在值而不是指標上呼叫sync.WaitGroup方法?
儘管sync.WaitGroup文件表明其方法需要一個*sync.WaitGroup 接收器,可以對sync.WaitGroup 類型的值呼叫這些方法。這是因為所有sync.WaitGroup方法都有指標接收器,這表示編譯器在呼叫該方法時會自動將值轉換為指標。
sync.WaitGroup的空方法集
sync.WaitGroup 的實際方法集是空的。為了確認這一點,你可以使用反射:
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Output: 0
因此,看起來在sync.WaitGroup值上定義的方法實際上是*sync.WaitGroup方法集的一部分。
對值呼叫指標方法的簡寫符號
當您呼叫指標時方法對一個值,編譯器會將其轉換為對該值的指標的呼叫。例如:
var wg sync.WaitGroup wg.Add(1)
等價於:
(&wg).Add(1)
Go 規範規定,如果一個變數是可尋址的並且其方法集包含一個方法,則直接在該變數上呼叫該方法變數是在指向該變數的指標上呼叫它的簡寫。
相關問題
有關此主題的更多信息,請參閱相關問題:
以上是為什麼我可以對值呼叫sync.WaitGroup 方法,而不僅僅是指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!