Fixes #198
This commit is contained in:
chai2010
2016-01-18 11:22:04 +08:00
parent 884ada9cd0
commit 9666211cd7
71 changed files with 107 additions and 105 deletions

View File

@@ -52,7 +52,7 @@ w.Circle.Radius = 5
w.Spokes = 20
```
Go語言有一個特性讓我們隻聲明一個成員對應的數據類型而不指名成員的名字這類成員就叫匿名成員。匿名成員的數據類型必是命名的類型或指向一個命名的類型的指針。下面的代碼中Circle和Wheel各自都有一個匿名成員。我們可以説Point類型被嵌入到了Circle結構體同時Circle類型被嵌入到了Wheel結構體。
Go語言有一個特性讓我們隻聲明一個成員對應的數據類型而不指名成員的名字這類成員就叫匿名成員。匿名成員的數據類型必是命名的類型或指向一個命名的類型的指針。下面的代碼中Circle和Wheel各自都有一個匿名成員。我們可以説Point類型被嵌入到了Circle結構體同時Circle類型被嵌入到了Wheel結構體。
```Go
type Circle struct {
@@ -85,7 +85,7 @@ w = Wheel{8, 8, 5, 20} // compile error: unknown fields
w = Wheel{X: 8, Y: 8, Radius: 5, Spokes: 20} // compile error: unknown fields
```
結構體字面值必遵循形狀類型聲明時的結構,所以我們隻能用下面的兩種語法,它們彼此是等價的:
結構體字面值必遵循形狀類型聲明時的結構,所以我們隻能用下面的兩種語法,它們彼此是等價的:
```Go
gopl.io/ch4/embed
@@ -121,6 +121,6 @@ w.X = 8 // equivalent to w.circle.point.X = 8
但是在包外部因爲circle和point沒有導出不能訪問它們的成員因此簡短的匿名成員訪問語法也是禁止的。
到目前未知,我們看到匿名成員特性隻是對訪問嵌套成員的點運算符提供了簡短的語法。稍後,我們將會看到匿名成員併不要求是結構體類型;其實任何命令的類型都可以作爲結構體的匿名成員。但是爲什麽要嵌入一個沒有任何子成員類型的匿名成員類型呢?
到目前爲止,我們看到匿名成員特性隻是對訪問嵌套成員的點運算符提供了簡短的語法。稍後,我們將會看到匿名成員併不要求是結構體類型;其實任何命令的類型都可以作爲結構體的匿名成員。但是爲什麽要嵌入一個沒有任何子成員類型的匿名成員類型呢?
答案是匿名類型的方法集。簡短的點運算符語法可以用於選擇匿名成員嵌套的成員也可以用於訪問它們的方法。實際上外層的結構體不僅僅是獲得了匿名成員類型的所有成員而且也獲得了該類型導出的全部的方法。這個機製可以用於將一個有簡單行爲的對象組合成有複雜行爲的對象。組合是Go語言中面向對象編程的核心我們將在6.3節中專門討論。