make loop

This commit is contained in:
chai2010
2015-12-26 20:05:30 +08:00
parent 82ec0c025d
commit e15e88dad7
74 changed files with 207 additions and 207 deletions

View File

@@ -29,7 +29,7 @@ func (p Point) Distance(q Point) float64 {
在Go語言中我們併不會像其它語言那樣用this或者self作爲接收器我們可以任意的選擇接收器的名字。由於接收器的名字經常會被使用到所以保持其在方法間傳遞時的一致性和簡短性是不錯的主意。這里的建議是可以使用其類型的第一個字母比如這里使用了Point的首字母p。
在方法調用過程中,接收器參數一般會在方法名之前現。這和方法聲明是一樣的,都是接收器參數在方法名字之前。下面是例子:
在方法調用過程中,接收器參數一般會在方法名之前現。這和方法聲明是一樣的,都是接收器參數在方法名字之前。下面是例子:
```Go
p := Point{1, 2}

View File

@@ -13,7 +13,7 @@ func (p *Point) ScaleBy(factor float64) {
在現實的程序里一般會約定如果Point這個類有一個指針作爲接收器的方法那麽所有Point的方法都必鬚有一個指針接收器卽使是那些併不需要這個指針接收器的函數。我們在這里打破了這個約定隻是爲了展示一下兩種方法的異同而已。
隻有類型(Point)和指向他們的指針(*Point)是可能會現在接收器聲明里的兩種接收器。此外,爲了避免歧義,在聲明方法時,如果一個類型名本身是一個指針的話,是不允許其現在接收器中的,比如下面這個例子:
隻有類型(Point)和指向他們的指針(*Point)是可能會現在接收器聲明里的兩種接收器。此外,爲了避免歧義,在聲明方法時,如果一個類型名本身是一個指針的話,是不允許其現在接收器中的,比如下面這個例子:
```go
type P *int
@@ -105,7 +105,7 @@ func (list *IntList) Sum() int {
}
```
當你定義一個允許nil作爲接收器值的方法的類型時在類型前面的註釋中指nil變量代表的意義是很有必要的就像我們上面例子里做的這樣。
當你定義一個允許nil作爲接收器值的方法的類型時在類型前面的註釋中指nil變量代表的意義是很有必要的就像我們上面例子里做的這樣。
下面是net/url包里Values類型定義的一部分。

View File

@@ -11,7 +11,7 @@ type ColoredPoint struct {
}
```
我們完全可以將ColoredPoint定義爲一個有三個字段的struct但是我們卻將Point這個類型嵌入到ColoredPoint來提供X和Y這兩個字段。像我們在4.4節中看到的那樣內嵌可以使我們在定義ColoredPoint時得到一種句法上的簡寫形式併使其包含Point類型所具有的一切字段然後再定義一些自己的。如果我們想要的話我們可以直接認爲通過嵌入的字段就是ColoredPoint自身的字段而完全不需要在調用時指Point比如下面這樣。
我們完全可以將ColoredPoint定義爲一個有三個字段的struct但是我們卻將Point這個類型嵌入到ColoredPoint來提供X和Y這兩個字段。像我們在4.4節中看到的那樣內嵌可以使我們在定義ColoredPoint時得到一種句法上的簡寫形式併使其包含Point類型所具有的一切字段然後再定義一些自己的。如果我們想要的話我們可以直接認爲通過嵌入的字段就是ColoredPoint自身的字段而完全不需要在調用時指Point比如下面這樣。
```go
var cp ColoredPoint

View File

@@ -2,7 +2,7 @@
Go語言里的集合一般會用map[T]bool這種形式來表示T代表元素類型。集合用map類型來表示雖然非常靈活但我們可以以一種更好的形式來表示它。例如在數據流分析領域集合元素通常是一個非負整數集合會包含很多元素併且集合會經常進行併集、交集操作這種情況下bit數組會比map表現更加理想。(譯註這里再補充一個例子比如我們執行一個http下載任務把文件按照16kb一塊劃分爲很多塊需要有一個全局變量來標識哪些塊下載完成了這種時候也需要用到bit數組)
一個bit數組通常會用一個無符號數或者稱之爲“字”的slice或者來表示每一個元素的每一位都表示集合里的一個值。當集合的第i位被設置時我們説這個集合包含元素i。下面的這個程序展示了一個簡單的bit數組類型併且實現了三個函數來對這個bit數組來進行操作
一個bit數組通常會用一個無符號數或者稱之爲“字”的slice或者來表示每一個元素的每一位都表示集合里的一個值。當集合的第i位被設置時我們説這個集合包含元素i。下面的這個程序展示了一個簡單的bit數組類型併且實現了三個函數來對這個bit數組來進行操作
```go
gopl.io/ch6/intset
@@ -103,7 +103,7 @@ func (*IntSet) Copy() *IntSet // return a copy of the set
練習6.2: 定義一個變參方法(*IntSet).AddAll(...int)這個方法可以爲一組IntSet值求和比如s.AddAll(1,2,3)。
練習6.3: (*IntSet).UnionWith會用|操作符計算兩個集合的交集我們再爲IntSet實現另外的幾個函數IntersectWith(交集元素在A集合B集合均現),DifferenceWith(差集:元素現在A集合現在B集合),SymmetricDifference(併差集:元素現在A但沒有現在B或者現在B沒有現在A)。
練習6.3: (*IntSet).UnionWith會用|操作符計算兩個集合的交集我們再爲IntSet實現另外的幾個函數IntersectWith(交集元素在A集合B集合均現),DifferenceWith(差集:元素現在A集合現在B集合),SymmetricDifference(併差集:元素現在A但沒有現在B或者現在B沒有現在A)。
練習6.4: 實現一個Elems方法返迴集合中的所有元素用於做一些range之類的遍歷操作。
練習6.5: 我們這章定義的IntSet里的每個字都是用的uint64類型但是64位的數值可能在32位的平颱上不高效。脩改程序使其使用uint類型這種類型對於32位平颱來説更合適。當然了這里我們可以不用簡單粗暴地除64可以定義一個常量來決定是用32還是64這里你可能會用到平颱的自動判斷的一個智能表達式32 << (^uint(0) >> 63)

View File

@@ -2,7 +2,7 @@
一個對象的變量或者方法如果對調用方是不可見的話,一般就被定義爲“封裝”。封裝有時候也被叫做信息隱藏,同時也是面向對象編程最關鍵的一個方面。
Go語言隻有一種控製可見性的手段大寫首字母的標識符會從定義它們的包中被導小寫字母的則不會。這種限製包內成員的方式同樣適用於struct或者一個類型的方法。因而如果我們想要封裝一個對象我們必鬚將其定義爲一個struct。
Go語言隻有一種控製可見性的手段大寫首字母的標識符會從定義它們的包中被導小寫字母的則不會。這種限製包內成員的方式同樣適用於struct或者一個類型的方法。因而如果我們想要封裝一個對象我們必鬚將其定義爲一個struct。
這也就是前面的小節中IntSet被定義爲struct類型的原因盡管它隻有一個字段
```go
@@ -16,7 +16,7 @@ type IntSet struct {
type IntSet []uint64
```
盡管這個版本的IntSet在本質上是一樣的他也可以允許其它包中可以直接讀取併編輯這個slice。換句話説相對*s這個表達式會現在所有的包中s.words隻需要在定義IntSet的包中現(譯註:所以還是推薦後者吧的意思)。
盡管這個版本的IntSet在本質上是一樣的他也可以允許其它包中可以直接讀取併編輯這個slice。換句話説相對*s這個表達式會現在所有的包中s.words隻需要在定義IntSet的包中現(譯註:所以還是推薦後者吧的意思)。
這種基於名字的手段使得在語言中最小的封裝單元是package而不是像其它語言一樣的類型。一個struct類型的字段對同一個包的所有代碼都有可見性無論你的代碼是寫在一個函數還是一個方法里。
@@ -72,7 +72,7 @@ func (l *Logger) Prefix() string
func (l *Logger) SetPrefix(prefix string)
```
Go的編碼風格不禁止直接導字段。當然,一旦進行了導就沒有辦法在保證API兼容的情況下去除對其的導,所以在一開始的選擇一定要經過深思熟慮併且要考慮到包內部的一些不變量的保證,未來可能的變化,以及調用方的代碼質量是否會因爲包的一點脩改而變差。
Go的編碼風格不禁止直接導字段。當然,一旦進行了導就沒有辦法在保證API兼容的情況下去除對其的導,所以在一開始的選擇一定要經過深思熟慮併且要考慮到包內部的一些不變量的保證,未來可能的變化,以及調用方的代碼質量是否會因爲包的一點脩改而變差。
封裝併不總是理想的。
雖然封裝在有些情況是必要的但有時候我們也需要暴露一些內部內容比如time.Duration將其表現暴露爲一個int64數字的納秒使得我們可以用一般的數值操作來對時間進行對比甚至可以定義這種類型的常量