Go语言初级学习 | 青训营

78 阅读2分钟

文件构建结构

  • 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)
    • 空结构
      • 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 容易让人不理解该值,true or false意义可能就不够明确
    • 使用 chan struct{} 就很清楚,我们不在乎值,只关心发生的事儿,更容易表达清楚一些。
  • 为了防止 unkeyed 初始化结构,可以添加 _ struct {} 字段

    • 使用 Q{X: 1, Y: 1} 可以

    • 使用 Q{1, 1} 就会出现编译错误:too few values in struct initializer,同时这样也帮助了 go ver 代码检查。