go语言基础 | 青训营笔记

56 阅读3分钟

数据类型

go中的数据类型分为两类,值类型和引用类型。但是go中函数的传参只有值传递一种方式,也就是说,把当前要传递的值复制到一块新的内存块中。大概来说,值类型的存储方式就是所有的数据都在那一块之中,而引用则是存着一个地址,这个地址指向的空间才是真正存储的值。

  • 值类型主要有:int系列、float系列、bool、string、数组结构体

  • 引用类型有:指针、slice切片、管道channel、接口interface、map、函数等。

零值、空值与空结构

青训营阅读材料之《Golang 零值、空值与空结构》

  • 零值就是声明而未初始化的默认值,对于值类型来说,数值类型为0、bool类型为false、字符串为"",数组与结构体为每个成员的零值;对于引用类型,统一为nil。
  • 空值没有类型信息,如果对一个interface类型赋了一个带类型信息的nil值,那么这个interface也不是一个空值。因为只有interface存储时需要考虑当前的type是什么,其他类型nil就是nil。
  • 空结构是没有任何字段的结构类型,由于其不占用存储空间,可以用它来做一些判定或者一些trick。
    • chan struct{} 代替 chan bool 在goroutines之间传递信号
    • 实现set
    • 防止unkeyed初始化结构,可以添加 _ struct {} 字段

声明与初始化方式

青训营阅读材料之《Go初始化变量的招式》

  • 值类型的初始化,默认初始化为零值。new相当于是一个语法糖,返回对应类型的指针并初始化为对应的零值。
  • 对引用类型的new是不怎么会起作用的,这样内部的指针还是一个空值,可以通过字面值或者make来创建。

函数、方法与接口

青训营阅读材料之《Golang函数式编程简述》

多返回值函数

根据青训营阅读材料之《通过汇编看golang函数的多返回值

多返回值的实现实际上相当于一个语法糖,由调用函数预先分配好空间并将地址传入被调用函数。

闭包

青训营阅读材料之《go语言闭包详解》

闭包中的外部变量和外部是完完全全的同一个值,不希望外部的改变反映到闭包中需要走一道复制(例如,函数传参)。

方法

方法就是在函数的基础上加上一个receiver类型,表明哪种类型可以调用这个函数。

receiver要么是原始类型,要么是对应的指针类型,调用的时候,无论是通过原始类型还是指针类型调用,都会隐式为其加上取地址或者解引用的行为,来保证正确性。最终行为与receiver类型一致,如果是原始就复制原始类型,如果是指针就复制指针。

需要注意的是nil也是一个合法的接收器。

通过嵌入类型也可将方法嵌入到对应的结构体中,(数据上组合,方法上继承)。

接口

青训营阅读材料之《Golang interface 接口深入理解》。 一些函数类型的组合,实现了这些方法即实现了该接口,可以作为该接口的值。

包与测试

青训营阅读材料之《新版本Golang的包管理入门教程》

一般来说,包的名字最好和所在文件夹的名字相同,(如果不同的话,导入按路径,使用按包名)

关于测试的话,现在只会写点单元测试。青训营阅读材料之《Golang单元测试之路漫漫》

并发与底层

TBD,这部分还没学会。