从零开始:Go语言学习之路(02)——Go语言基础知识注意点

2020-07-09 00:00:00 函数 语言 变量 数组 切片

仅列出与C/C++不同之处或需注意之处,如需更详尽基础的说明,建议参考Go 语言基础语法 | 菜鸟教程

  1. 在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。如果将多个语句写在同一行,它们则必须使用 ; 人为区分(不鼓励这种做法)。
  2. 声明变量的一般形式是使用 var 关键字,格式:var identifier type;变量声明的三种方式:
    1. 指定变量类型,声明后若不赋值,使用默认值:var a int = 10
    2. 根据值自行判定变量类型:var b = 10
    3. 省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会报错:c : = 10
  3. 使用 := 赋值操作符的简短形式是使用变量的形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。
  4. 如果你声明了一个局部变量却没有在相同的代码块中使用它,会得到编译错误a declared and not used
  5. 但是全局变量是允许声明但不使用。 同一类型的多个变量可以声明在同一行,如:var a, b, c int
  6. 常量的定义格式:const identifier [type] = value,type可省略
    1. 显式类型定义: const b string = "abc"
    2. 隐式类型定义: const b = "abc"
  7. select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
  8. for循环:Go语言的For循环有3中形式,只有其中的一种使用分号。
    1. 和 C 语言的 for 一样:for init; condition; post { }
    2. 和 C 的 while 一样:for condition { }
    3. 和 C 的 for(;;) 一样:for { }
    4. for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:for key, value := range oldMap {newMap[key] = value}
  9. Go 语言的 goto 语句可以无条件地转移到过程中指定的行。在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
  10. Go 语言函数定义格式如下:func function_name( [parameter list] ) [return_*] {
    函数体},例如func max(num1, num2 int) int {...}
  11. Go 函数可以返回多个值,例如:func swap(x, y string) (string, string) {return y, x}
  12. Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。(关于闭包不是很理解,日后需要用到再深入理解,暂不清楚意义在哪里)
  13. Go数组的定义:var balance [10] float32
  14. Go数组的初始化:var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
  15. Go指针声明格式:var var_name *var-type,例如var ip *int
  16. 一个指针被定义后没有分配到任何变量时,它的值为 nil,和其它语言的null、None、nil、NULL一样,都指代零值或空值。
  17. Go 语言切片(Slice):对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
  18. range 关键字:用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。
  19. Map(集合):Map 是一种无序的键值对的集合。Map 重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
  20. Go 语言接口:它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
  21. Go 错误处理:Go 语言通过内置的错误接口提供了非常简单的错误处理机制。error类型是一个接口类型,这是它的定义:type error interface {Error() string}我们可以在编码中通过实现 error 接口类型来生成错误信息。函数通常在后的返回值中返回错误信息。使用errors.New 可返回一个错误信息:func Sqrt(f float64) (float64, error) {
    if f < 0 {
    return 0, errors.New("math: square root of negative number")
    }
    // 实现
    }

相关文章