Skip to content

Commit 8215a54

Browse files
committed
包和文件
1 parent 919f1e3 commit 8215a54

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

ch02 程序结构/05-popcount/main.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package popcount
2+
3+
var pc [256]byte
4+
5+
func init() {
6+
for i := range pc {
7+
pc[i] = pc[i/2] + byte(i&1)
8+
}
9+
}
10+
11+
// PopCount returns the population count (number of set bits) of x.
12+
func PopCount(x uint64) int {
13+
return int(pc[byte(x>>(0*8))] +
14+
pc[byte(x>>(1*8))] +
15+
pc[byte(x>>(2*8))] +
16+
pc[byte(x>>(3*8))] +
17+
pc[byte(x>>(4*8))] +
18+
pc[byte(x>>(5*8))] +
19+
pc[byte(x>>(6*8))] +
20+
pc[byte(x>>(7*8))])
21+
}

ch02 程序结构/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ fmt.Printf(float64(c)) // "100"; does not call String
297297

298298
在Go语言中,一个简单的规则是:如果一个名字是大写字母开头的,那么该名字是导出的。
299299

300+
#### 2.6.1 导入包
301+
在Go语言程序中,每个包都是有一个全局唯一的导入路径。导入语句中类似"gopl.io/ch2/tempconv"的字符串对应包的导入路径。Go语言的规范并没有定义这些字符串的具体含义或者包来自哪里,他们是由构建工具来解释的。当使用Go语言自带的go工具箱时,一个导入路径代表一个目录中的一个或多个Go源文件。
302+
300303
```golang
301304
package main
302305

@@ -321,4 +324,31 @@ func main() {
321324
f, tempvonc.FToC(f), c, tempconv.CToF(c))
322325
}
323326
}
327+
```
328+
329+
#### 包的初始化
330+
331+
包的初始化首先是解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化:
332+
333+
```golang
334+
var a = b + c // a 第三个初始化,为3
335+
var b = f() // b 第二个初始化,为2,通过调用f(依赖c)
336+
var c = 1 // c 第一个初始化,为1
337+
338+
func f() int { return c + 1 }
339+
```
340+
如果包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化,Go语言的构建工具首先会将.go文件根据文件名排序,然后依次调用编译器编译。
341+
342+
对于在包级别声明的变量,如果有初始化表达式则用表达式初始化,还有一些没有初始化表达式的,例如某些表格数据初始化并不是一个简单的赋值过程。在这种情况下,我们可以用一个特殊的init初始化函数来简化初始化工作。每个文件都可以包含多个init初始化函数
343+
```golang
344+
func init() { /* ... */}
345+
```
346+
这样的init初始化函数除了不能被调用或引用外,其他行为和普通函数类似。程序开始执行时按照它们的声明顺序被自动调用。
347+
348+
每个包在解决依赖的前提下,以导入声明的顺序初始化,每个包只会被初始化一次。因此,如果p包导入了q包,那么在p包初始化的时候可以认为q包必然已经初始化过了。初始化工作是自上而下进行的,main包最后被初始化。以这种方式,可以确保在main函数执行之前,所有依赖的包都已经完成初始化工作。
349+
350+
```golang
351+
// 下面代码定义了一个PopCount函数,用于返回一个数字中含二进制 1bit 的个数。它使用 init 初始化函数来
352+
// 生成辅助表格 pc,pc 表格用于处理每个 8bit 宽度的数字含二进制的 1bit 的 bit 个数,这样的话在处理
353+
// 64bit 宽度的数字时就没有必要循环 64 此, 只需要8次查表就可以了。
324354
```

0 commit comments

Comments
 (0)