Go xmas2020 学习笔记 06、Control Statements、Declarations & Types
课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)
主讲老师 Matt Holiday

06-Control Statements
If-then-else
- 花括号是必须写的,而且有严格的格式
- if 语句内可以写短声明
Loop
for
range array
注意第二种方式 v 是被拷贝的,假设 myArray
是个 4K 大小的数组,那么每次循环时都会进行复制,这种情况下最好采用第一种方式。第一种更加高效,只用索引的方式直接从数组中获取避免了复制。
range map
这两种情况下,循环都会进行很长的时间。
在 c++
中 map
是基于树形结构的,它又一个隐含的顺序,按字母顺序排列。
在 go
中 map
是无序的,基于哈希表。不同时间迭代映射会得到不同的顺序。如果你需要顺序取出,那你要先取出 keys
然后对其按字母进行排列,再遍历从maps
取出值。
infinite loop
common mistake
labels and loops
例子中可能 returnedData
切片很长,所以匹配到第一个之后应该返回到标签 outer
的外部循环。
需要明确指出 continue outer
,即对应 outer
标签
Switch
switch
switch
其实就是 if else 的语法糖。更容易理解,提高可读性。- 可以在
switch
后短声明。 - 可以为一个
case
添加空的语句段,只判断不执行。 - 不需要添加
break
。 - 最好添加
default
。
switch on true
cases
可以有逻辑语句,就像一堆 if else,更加方便。
Packages
所有 go
文件必须以 package
开头。
短声明只能在函数中使用,因为在包中应该以关键词开头,这样方便编译器解析。
如果首字母大写,那么就是导出的,否则是私有的。
包依赖应该是一个树形结构,不能循环依赖。
包内的东西将在 main
函数前被初始化,在运行时将会执行包内的 init
函数(在main调用前)。
循环依赖会导致不知道优先初始化哪个的问题。
好的包在一个简单的 api 后面封装了深层复杂的功能
06-Declarations & Types
Declaration
Short declarations
重点讲一下第三条
- 第一行用短声明了
err
变量 - 第二行重复声明
err
会报错 - 第三行会正确运行,因为声明了新变量
x
,而err
只是重新赋值
Structural typing
duck typing
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。
Operator
逻辑运算符只能给布尔值用,其他编程语言可能有 0 == false,但是 go 没有