Go 基础知识点

已经专职做了很久的 Python 开发,不过心中对当初带我入行 C 也一直有些留恋。Go 语言的设计和定位和 C 语言有很多共同之处,也融入了很多现代的设计理念,写起来很有当初写 C 的亲切感。准备好好学习下这门语言,这里记录下一些个人觉得重要的基础知识点,随着不断深入再补充。

基础语法

数组常量

如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组。

1
2
3
4
var arrInt0 [5]int   // 正常声明  
var arrInt1 = [5]int{18, 20, 15, 22} // 在声明时定义数组, 若元素数量不匹配, 可以忽略后面的元素
var arrInt2 = [...]int{5, 6, 7, 8, 22} // 使用切片的方式来定义数组, ... 可省略
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"} // key: value 方式, 只有索引 3 和 4 被赋予实际的值, 其他元素都被设置为空的字符串

new()make() 的区别

看起来二者没有什么区别,都在上分配内存,但是它们的行为不同,适用于不同的类型。

  • new(T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 *T 的内存地址:这种方法返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组结构体;它相当于 &T{}
  • make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片mapchannel

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

在的第一幅图中,代码为 var p *[]int = new([]int) 或者 p := new([]int) 。在第二幅图中,代码为 p := make([]int, 0),切片已经被初始化,但是指向一个空的数组。

以上两种方式实用性都不高。在实际开发中应采用下面的方法:

1
var v []int = make([]int, 10, 50)

或者

1
v := make([]int, 10, 50)

这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素。

开发规范

package 命名

  1. go不要求package的名称和所在目录名相同,但是你最好保持相同,否则容易引起歧义。因为引入包的时候,go会使用子目录名作为包的路径,而你在代码中真正使用时,却要使用你package的名称。
  2. 每个子目录中只能存在一个package,否则编译时会报错。

参考资料