Go学习——《Go语言程序设计》Chap2

布尔与数值类型

注释

//单行注释被编译器当作一个换行符,/* */多行注释划定同行被当作一个空格,多行被当作换行符。

常量和变量

1
2
3
4
5
6
7

const limit = 512 // 常量,其类型兼容任何数字
const top uint16 = 1421 // 常量,类型,uint16
start := -19 // 变量,推断类型,int
end := int64(9876543210) // 变量。类型,int64
var i int // 变量,类型,int
var debug = false // 变量,推断类型,bool

多个常量,用一个const组合

1
2
3
4
5
const {
Cyan = 0
Magenta = 1
Yellow = 2
}

iota预定义的标识符表示连续的无类型整数常量。每次关键字const出现时,它的值重设为 0(因此,每次都会定义一组新的常量),而每个常量的声明的增量为 1。

布尔与布尔表达式

布尔类型:ture,false

布尔操作符:与 C 常见(除了位运算)相同。

注意&&,||仍然是短路规则的。

用于比较操作符(小于大于等)进行比较的值,Go 会严格筛选,两个值必须是相通类型的,或者如果它们是接口,就必须实现了相同的接口类型。如果有一个值是常量,那么他的类型必须与另一个类型兼容。这意味着一个无类型的数值常量可以跟另一个任意数值类型的值进行比较,但是不同类型且非常量的数值不能直接比较。

数值类型

类型转换用type(value)的形式。

大整数的用法(Machin 公式),一些方法会再返回时将结果保存回其接收器中,也即big.Int类型大部分方法会修改他的接收器(这样做是为了节省创建大量临时big.Int值的开销)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func π(places int) *big.Int {
digits := big.NewInt(int64(places))
unity := big.NewInt(0)
ten := big.NewInt(10)
exponent := big.NewInt(0)
unity.Exp(ten, exponent.Add(digits, ten), nil)
pi := big.NewInt(4)
left := arccot(big.NewInt(5), unity)
left.Mul(left, big.NewInt(4))
right := arccot(big.NewInt(239), unity)
left.Sub(left, right)
pi.Mul(pi, left)
return pi.Div(pi, big.NewInt(0).Exp(ten, ten, nil))
}

浮点类型

Go 内置的浮点类型:float32,float64,complex64(实部虚部都是一个 float32),complex128(实部虚部都是一个 float64)。

介绍了一些 math 包中的常量与函数

例子:statistics

一个 Web 服务器统计工具

实现一个简单的统计函数

定义类型

1
2
3
4
5
type statistics struct {
numbers []float64
mean float64
median float64
}
1
2
3
4
5
6
7
8
9
func getStats(numbers []float64) (stats statistics) {
// 切片赋值
stats.numbers = numbers
// 修改了
sort.Float64s(stats.numbers)
stats.mean = sum(numbers) / float64(len(numbers))
stats.median = median(numbers)
return stats
}

getStatus 函数作用就是传入[]float64切片,然后统计,返回制定类型(带切片、统计数据的 statistics 聚合类型)。

其中计算中位数使用了sort包里的Float64s()函数对原数组进行排序,也就是说getStatus修改了切片参数,这种情况在传切片、引用或者指针到函数时很常见。如果要保留原始切片,可以使用 Go 语言内置的copy()函数,将它赋值到一个临时变量,使用临时变量来工作。

实现一个基本的 HTTP 服务器

1
2
3
4
5
6
func main() {
http.HandleFunc("/", homePage)
if err := http.ListenAndServ (":9002", nil); err != nil {
log.Fatal("failed to start server", err)
}
}

http.HandleFunc()函数用来注册“路径-函数”,两个参数:一个路径,一个当这个路径被请求时会被执行的函数的引用。

http.ListenAndServe()函数使用给定的 TCP 地址启动一个 Web 服务器,第二个参数支持自定义服务器,为空的花表示使用默认的类型。