假設我有一個結構,這個結構有 2 個方法。一個是用星號寫的,另一個不是。這是理解示例的代碼。
type object struct{
name string
age int
}
func (obj *object) methodOne{
// do something
}
func (obj object) methodTwo{
// do something
}
我知道指標,但仍然不理解這個例子中的概念。
uj5u.com熱心網友回復:
正如檔案所說:
func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct) valueMethod() { } // method on value
對于不習慣指標的程式員來說,這兩個例子之間的區別可能會讓人感到困惑,但情況其實很簡單。當在一個型別上定義一個方法時,接收者(在上面的例子中)表現得就像它是方法的一個引數一樣。將接收者定義為值還是指標是同一個問題,那么,函式引數應該是值還是指標。有幾個考慮。
首先,也是最重要的,該方法是否需要修改接收器?如果是這樣,接收者必須是一個指標。(切片和映射充當參考,因此它們的故事有點微妙,但例如要在方法中更改切片的長度,接收者仍然必須是指標。)在上面的示例中,如果 pointerMethod 修改了s,呼叫者將看到這些更改,但 valueMethod 是使用呼叫者引數的副本呼叫的(這是傳遞值的定義),因此呼叫者將看不到它所做的更改。
其次是效率的考慮。如果接收器很大,例如一個大結構,使用指標接收器會便宜得多。
其次是一致性。如果該型別的某些方法必須具有指標接收器,那么其余的也應該具有,因此無論該型別如何使用,方法集都是一致的。有關詳細資訊,請參閱方法集部分。
對于基本型別、切片和小型結構等型別,值接收器非常便宜,因此除非方法的語意需要指標,否則值接收器是高效且清晰的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506477.html
