type
status
date
slug
summary
tags
category
icon
password
已经专职做了很久的 Python 开发,不过心中对当初带我入行 C 也一直有些留恋。Go 语言的设计和定位和 C 语言有很多共同之处,也融入了很多现代的设计理念,写起来很有当初写 C 的亲切感。准备好好学习下这门语言,这里记录下一些个人觉得重要的基础知识点,随着不断深入再补充。
基础语法
数组常量
如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组。
new()
和 make()
的区别
看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。
new(T)
为每个新的类型T
分配一片内存,初始化为 0 并且返回类型为*T
的内存地址:这种方法返回一个指向类型为T
,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于&T{}
。
make(T)
返回一个类型为T
的初始值,它只适用于3种内建的引用类型:切片、map 和 channel。
换言之,
new
函数分配内存,make
函数初始化;下图给出了区别:
在的第一幅图中,代码为
var p *[]int = new([]int)
或者 p := new([]int)
。在第二幅图中,代码为 p := make([]int, 0)
,切片已经被初始化,但是指向一个空的数组。以上两种方式实用性都不高。在实际开发中应采用下面的方法:
或者
这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素。
开发规范
package 命名
- go不要求package的名称和所在目录名相同,但是你最好保持相同,否则容易引起歧义。因为引入包的时候,go会使用子目录名作为包的路径,而你在代码中真正使用时,却要使用你package的名称。
- 每个子目录中只能存在一个package,否则编译时会报错。
指针和值的使用
- 推荐在实例方法上使用指针(前提是这个类型不是一个自定义的 map 、slice 等引用类型)
- 当结构体较大的时候使用指针会更高效
- 如果要修改结构内部的数据或状态必须使用指针
- 当结构类型包含 sync.Mutex 或者同步这种字段时,必须使用指针以避免成员拷贝
- 如果你不知道该不该使用指针,使用指针!
“结构较大” 到底多大才算大可能需要自己或团队衡量,如超过 5 个字段或者根据结构体内占用来计算。