1 回答

TA貢獻1817條經驗 獲得超14個贊
如果在結構中嵌入類型,則嵌入類型的字段和方法將提升為嵌入類型。它們“作用”就像在嵌入器類型上定義一樣。
這是什么意思?如果類型嵌入類型,并且類型有一個方法,你可以調用類型(接收方仍然是,這不是繼承也不是虛方法)。A
B
B
String()
String()
A
B
目前為止,一切都好。但是,如果類型嵌入了類型和類型,兩者都有一個方法呢?然后會模棱兩可,因此在這種情況下,該方法將不會被推廣。A
B
C
String()
A.String()
String()
這解釋了您的經歷。打印將具有默認格式(結構字段),因為將有 2 種方法,因此沒有一個用于其自身。當然,默認格式設置涉及打印字段,并且為了生成值的默認表示形式,包會檢查正在打印的值是否實現 ,如果是,則調用其方法。Engineer
String()
Engineer
string
fmt
fmt.Stringer
String()
如果刪除 ,則只有一個方法被提升,from ,因此該方法由包調用以生成值本身的表示形式。Person.String()
String()
TaxPlayer
fmt
string
Engineer
同樣,如果你刪除 :那么將是唯一提升的方法,所以它用于值本身。TaxPayer.String()
Person.String()
String()
Engineer
這在 Spec: 結構類型中有詳細說明:
如果結構中嵌入字段的字段或方法是表示該字段或方法的合法選擇器,則稱為升級。
f
x
x.f
f
[...]給定一個結構類型和一個定義的類型,升級的方法包含在結構的方法集中,如下所示:
S
T
如果包含一個嵌入字段,則 方法集 和 兩者都包括帶有接收器的提升方法。的方法集還包括帶有接收器的提升方法。
S
T
S
*S
T
*S
*T
如果包含一個嵌入字段,則 的方法集 和 兩者都包括帶有 receiver 或 的升級方法。
S
*T
S
*S
T
*T
第一句說“如果x.f
是法定選擇器”。法律是什么意思?
x.f表示值 的字段或方法。
f
x
[...]選擇器可以表示某種類型的字段或方法,也可以引用 嵌套嵌入字段 的字段或方法。遍歷以達到的嵌入場的數量稱為 其深度在 中。中聲明的字段或方法的深度為零。在 嵌入的字段中聲明的字段或方法 f 的深度是 in 加一的深度。
f
f
T
f
T
f
T
f
T
A
T
f
A
以下規則適用于選擇器:
對于類型或 where 的值不是指針或接口類型,表示存在此類 .如果深度不正好有一個
f
,則選擇器表達式是非法的。x
T
*T
T
x.f
T
f
[...]
強調了本質,并解釋了為什么首先沒有調用任何方法:可能來自2個“源”:和,因此是非法的選擇器,因此沒有一個方法將是方法集的一部分。String()
Engineer.String()
Person.String
TaxPayer.String
Engineer.String
String()
Engineer
使用非法選擇器會引發編譯時錯誤(例如“不明確的選擇器工程師。福”)。因此,您收到錯誤,因為您顯式嘗試引用 。但是僅僅嵌入2種類型都有,這不是編譯時錯誤。嵌入本身不是錯誤。使用非法選擇器將是錯誤。如果你寫 ,那會再次引發編譯時錯誤。但是如果你只是通過打?。?,這里沒有非法的選擇器,你就不參考了。這是允許的。(當然,由于方法集 沒有提升的方法,因此只有在打印字段時才會調用它來生成 – 的字符串表示形式。engineer.Foo
String()
engineer.String()
engineer
fmt.Println(engineer)
engineer.String()
Engineer
String()
Engineer
- 1 回答
- 0 關注
- 113 瀏覽
添加回答
舉報