回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,28 +1,28 @@
### 2.6.2. 包的初始化
包的初始化首先是解決包級變量的依賴順序,然安照包級變量聲明出現的順序依次初始化:
包的初始化首先是解决包级变量的依赖顺序,然安照包级变量声明出现的顺序依次初始化:
```Go
var a = b + c // a 第三初始化, 3
var b = f() // b 第二初始化, 2, 通過調用 f (依c)
var c = 1 // c 第一初始化, 1
var a = b + c // a 第三初始化, 3
var b = f() // b 第二初始化, 2, 通过调用 f (依c)
var c = 1 // c 第一初始化, 1
func f() int { return c + 1 }
```
如果包中含有多.go源文件們將按照發給編譯器的順序進行初始化Go言的建工具首先會將.go文件根文件名排序,然依次調用編譯器編譯
如果包中含有多.go源文件们将按照发给编译器的顺序进行初始化Go言的建工具首先会将.go文件根文件名排序,然依次调用编译器编译
對於在包級别聲明的量,如果有初始化表達式則用表式初始化,有一些有初始化表式的,例如某些表格數據初始化不是一個簡單的賦值過程。在這種情況下,我可以用一特殊的init初始化函數來簡化初始化工作。每文件都可以包含多init初始化函
对于在包级别声明的量,如果有初始化表达式则用表式初始化,有一些有初始化表式的,例如某些表格数据初始化不是一个简单的赋值过程。在这种情况下,我可以用一特殊的init初始化函数来简化初始化工作。每文件都可以包含多init初始化函
```Go
func init() { /* ... */ }
```
這樣的init初始化函除了不能被調用或引用外,其他行和普通函數類似。在每文件中的init初始化函,在程序開始執行時按照它們聲明的序被自動調用。
这样的init初始化函除了不能被用或引用外,其他行和普通函数类似。在每文件中的init初始化函,在程序开始执行时按照它们声明的序被自动调用。
包在解決依賴的前提下,以導入聲明的序初始化,每個包隻會被初始化一次。因此,如果一p包入了q包在p包初始化的候可以認爲q包必然已初始化了。初始化工作是自下而上行的main包最被初始化。以這種方式,可以保在main函數執行之前,所有依然的包都已完成初始化工作了。
包在解决依赖的前提下,以导入声明的序初始化,每个包只会被初始化一次。因此,如果一p包入了q包在p包初始化的候可以认为q包必然已初始化了。初始化工作是自下而上行的main包最被初始化。以这种方式,可以保在main函数执行之前,所有依然的包都已完成初始化工作了。
下面的代碼定義了一PopCount函,用於返迴一個數字中含二進製1bit的個數。它使用init初始化函數來生成助表格pcpc表格用於處理每8bit度的字含二進製的1bit的bit個數,這樣的話在處理64bit度的數字時就沒有必要循64次需要8次表就可以了。(這併不是最快的統計1bit目的算法但是它可以方便演示init函的用法,且演示了如果生成助表格,這是編程中常用的技)。
下面的代码定义了一PopCount函,用于返回一个数字中含二进制1bit的个数。它使用init初始化函数来生成助表格pcpc表格用于处理每8bit度的字含二进制的1bit的bit个数,这样的话在处理64bit度的数字时就没有必要循64次需要8次表就可以了。(这并不是最快的统计1bit目的算法但是它可以方便演示init函的用法,且演示了如果生成助表格,这是编程中常用的技)。
<u><i>gopl.io/ch2/popcount</i></u>
```Go
@@ -50,7 +50,7 @@ func PopCount(x uint64) int {
}
```
譯註對於pc這類需要複雜處理的初始化,可以通過將初始化邏輯包裝爲一個匿名函數處理,像下面這樣
译注对于pc这类需要复杂处理的初始化,可以通过将初始化逻辑包装为一个匿名函数处理,像下面这样
```Go
// pc[i] is the population count of i.
@@ -62,16 +62,16 @@ var pc [256]byte = func() (pc [256]byte) {
}()
```
意的是在init函range循環隻使用了索引,省略了有用到的值部分。循也可以這樣寫
意的是在init函range循环只使用了索引,省略了有用到的值部分。循也可以这样写
```Go
for i, _ := range pc {
```
在下一和10.5節還將看到其它使用init函的地方。
在下一和10.5节还将看到其它使用init函的地方。
**練習 2.3**PopCount函,用一個循環代替一的表式。比較兩個版本的性能。11.4節將展示如何繫統地比較兩個不同實現的性能。)
**练习 2.3**PopCount函,用一个循环代替一的表式。比较两个版本的性能。11.4节将展示如何系统地比较两个不同实现的性能。)
**練習 2.4** 用移位算法重PopCount函,每次測試最右的1bit後統計總數。比較和査表算法的性能差
**练习 2.4** 用移位算法重PopCount函,每次测试最右的1bit后统计总数。比较和查表算法的性能差
**練習 2.5**`x&(x-1)`於將x的最低的一非零的bit位清零。使用這個算法重PopCount函,然後比較性能。
**练习 2.5**`x&(x-1)`于将x的最低的一非零的bit位清零。使用这个算法重PopCount函,然后比较性能。