Go xmas2020 学习笔记 06、Control Statements、Declarations & Types

课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com)

主讲老师 Matt Holiday

image-20220401081031592

06-Control Statements

If-then-else

image-20220403143416752

  • 花括号是必须写的,而且有严格的格式
  • if 语句内可以写短声明

Loop

for

image-20220403151535163


range array

image-20220403151710262

注意第二种方式 v 是被拷贝的,假设 myArray 是个 4K 大小的数组,那么每次循环时都会进行复制,这种情况下最好采用第一种方式。第一种更加高效,只用索引的方式直接从数组中获取避免了复制。


range map

image-20220403155526840

这两种情况下,循环都会进行很长的时间。

c++map 是基于树形结构的,它又一个隐含的顺序,按字母顺序排列。

gomap 是无序的,基于哈希表。不同时间迭代映射会得到不同的顺序。如果你需要顺序取出,那你要先取出 keys 然后对其按字母进行排列,再遍历从maps 取出值。


infinite loop

image-20220404070856610


common mistake

image-20220404071027405


labels and loops

image-20220404071214722

例子中可能 returnedData 切片很长,所以匹配到第一个之后应该返回到标签 outer 的外部循环。

需要明确指出 continue outer ,即对应 outer 标签


Switch

switch

image-20220404071451116

  • switch 其实就是 if else 的语法糖。更容易理解,提高可读性。
  • 可以在 switch 后短声明。
  • 可以为一个 case 添加空的语句段,只判断不执行。
  • 不需要添加 break
  • 最好添加 default

switch on true

image-20220404072040968

cases 可以有逻辑语句,就像一堆 if else,更加方便。


Packages

image-20220404072301382

所有 go 文件必须以 package 开头。

短声明只能在函数中使用,因为在包中应该以关键词开头,这样方便编译器解析。


image-20220404072543682

如果首字母大写,那么就是导出的,否则是私有的。


image-20220404072727953

image-20220404090351683

包依赖应该是一个树形结构,不能循环依赖


image-20220404090532914

包内的东西将在 main 函数前被初始化,在运行时将会执行包内的 init 函数(在main调用前)

循环依赖会导致不知道优先初始化哪个的问题。


image-20220404090856952

好的包在一个简单的 api 后面封装了深层复杂的功能


06-Declarations & Types

Declaration

image-20220404091249750

image-20220404091316023


Short declarations

image-20220404091500794

重点讲一下第三条

  • 第一行用短声明了 err 变量
  • 第二行重复声明 err 会报错
  • 第三行会正确运行,因为声明了新变量 x,而 err 只是重新赋值

image-20220404092029077

image-20220404092231754


Structural typing

image-20220404092757716

duck typing

在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。


image-20220404092920843

image-20220404093411195

Operator

image-20220404093727823

逻辑运算符只能给布尔值用,其他编程语言可能有 0 == false,但是 go 没有


image-20220404093915246

posted @ 2022-04-04 09:44  小能日记  阅读(16)  评论(0编辑  收藏  举报