文件构建结构
- package
- import(),里面写导入的包,如常用的fmt,math/rand
- 可以写成像import "xxx",只不过可以圆括号一起写,简化import
- func main(){} main函数,rand.Intn(10)随机数
- 导出名:在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。
- 在导入一个包时,你只能引用其中已导出的名字。
- 任何“未导出”的名字在**该包(引用的)**外均无法访问。
go的零值,空值,空结构
-
零值
-
定义:当声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。
-
值类型
- 布尔:false、数值类型:0、字符串:""
-
引用类型
- 均为nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map
- nil,类似c++的null、python的None,是预先声明的标识符(非关键字保留字),表示未初始化的值
-
-
空值
nil是 Golang 中唯一没有默认类型的非类型化的值,它不是一个未定义的状态a:=nil错误,编译器不知该为a分配什么类型- 一般返回值为nil是用来作为error类型的值来判断错误
-
nil!=nil问题 - 由于接口需要两个属性 Type和Value
var p *int // (T=*int,V=nil)var i interface{} // (T=nil,V=nil)
- 这样当比较
p==i时,类型对比不正确,会返回false,因此错误处理是要小心,不要将变量没有初始化的nil返回回去,并且尽可能不要将两个值是nil的变量进行比较,要分开与nil比较 - 对于
var p *int // (T=*int, V=nil) fmt.Println(p == nil)- 由于编译器知道了p的类型,所以会对后面的
nil进行强制转换(*int)
- 由于编译器知道了p的类型,所以会对后面的
- 空结构
type Q struct{}或者var q struct{}- 占零字节,
unsafe.Sizeof(q)可查看- 结构嵌套结构也是零字节
- 通过make常见很多,或者直接定义都是0
var x [1000000000]struct{}var y = make([]struct{},1000000000)
- 弊端:两个不同的零大小的变量在内存中可能具有相同的地址
-
一个结构的实例的大小(即所占存储空间的字节数)是由其字段的宽度(size)和对齐(alignment)共同决定的,这样有助于寻址速度
-
用途
-
使用
chan struct{}代替chan bool在 goroutines 之间传递信号- 使用
bool容易让人不理解该值,trueorfalse意义可能就不够明确 - 使用
chan struct{}就很清楚,我们不在乎值,只关心发生的事儿,更容易表达清楚一些。
- 使用
-
为了防止 unkeyed 初始化结构,可以添加
_ struct {}字段-
使用
Q{X: 1, Y: 1}可以 -
使用
Q{1, 1}就会出现编译错误:too few values in struct initializer,同时这样也帮助了go ver代码检查。
-