Go 语言初探(二)

书接上回,咱接着讲 Go 的一些内容。

循环

for 语句

只有一种写法,和 matlab 有点像,不用写圆括号。

1
2
3
4
sum := 0
for i := 0; i < 10; i++ {
sum += i
}

Go 里面没有 while 循环,直接用 for 可以达到相同的效果。个人觉得这个设计还是可以的,省掉一个关键字

1
2
3
4
sum := 1
for sum < 1000 {
sum += sum
}

死循环

死循环可以这么写,算是语法糖?

1
2
3
for {
...
}

条件语句

if 基本使用

同 for 一样,条件不需要用圆括号,但必须要有花括弧

1
2
3
4
5
if x < 0 {
...
} else {
...
}

if 便捷使用

if 语句前可以加一个语句,而且作用域只在 if 范围内

1
2
3
if v:=math.Pow(x, n); v < slim {
...
}

switch 基本使用

在 C/C++ 里面的 switch 是需要 break 语句结束在 switch 中的条件。但 Go 中不需要,默认就是直接跳出。

1
2
3
4
5
6
7
8
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.", os)
}

如果需要实现 C/C++ 中连续执行的效果,则需要使用 fallthrough 结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var v uint32
switch len(src) {
default:
v |= uint32(src[3])
fallthrough
case 3:
v |= uint32(src[2]) << 8
fallthrough
case 2:
v |= uint32(src[1]) << 16
fallthrough
case 1:
v |= uint32(src[0]) << 24
}

switch 替代 if-else 链

我个人很喜欢这个特性,不用写一堆的 if - else if - else

1
2
3
4
5
6
7
8
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}

defer 语句

defer 语句会延迟函数的执行知道上层函数返回。这个特性最开始的时候我没想出使用的场景。搜了一下原来可以用在文件的打开和关闭上。麻麻再也不用担心资源没有释放了。某种意义上算是减轻了程序员的心智负担。

1
2
f, err := os.Create("test.txt")
defer f.Close()

实际上 defer 的函数会被压入一个栈中,会按照后进先出的顺序被调用。更多关于 defer 的信息参考这里

指针

雾草,Go 不是说好的现代语言么,为什么还有指针这种淫荡的货色。我仍旧没有忘记 C/C++ 中被指针支配的恐惧。

1
2
3
4
5
6
7
8
9
i, j := 42, 2701

p := &i // point to i
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i

p = &j // point to j
*p = *p / 37 // divide j through the pointer

哦原来没有指针运算的,其实就是引用的意思,吓死宝宝了。