Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
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)

AltStyle によって変換されたページ (->オリジナル) /