go 知识点合辑
Go
(u)int(8|16|32|64)、bool、string、uintptr、byte(=uint8)、rune(=uint32)、float[32|64]、complex[64|128]
chan、interface、func
array、slice、map
switch case
fallthrough : 强制执行后面的case代码
函数
不支持重载,一个包不能有两个名字一样的函数
命名返回值的名字(return可以不指定变量名)
可变参数
可变参数实际上是一个slice,可以通过arg[index]依次访问所有参数;通过len(arg)来判断变参的个数
main & init & defer
Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数
init()可以在任何package中出现(可选); main()只能用在package main 中(必需)
defer
当函数返回时,执行defer语句
多个defer语句,按先进后出的方式执行
defer语句中的变量,在defer声明时确定变量
触发异常也会走defer语句
闭包
闭包是一个函数和与其相关的引用环境组合而成的实体
函数可以存储到变量中作为参数传递给其它函数,能够被函数动态的创建和返回
值传递 & 引用传递
无论是值传递,还是引用传递,传递给函数的都是变量的副本; 值传递是值的拷贝,引用传递是地址的拷贝
map、slice、chan、指针、interface默认以引用的方式传递
new 分配内存,主要用来分配值类型,比如int、struct,返回的是指针
make 分配内存,主要用来分配引用类型,比如chan、map、slice
程序初始化与执行过程
程序的初始化和执行都起于main包, 编译时将依赖的包依次导入
如果一个包会被多个包同时导入,那么它只会被导入一次
流程:
包初始化时,会先逐层递归的将它依赖的包导入进来,直到顶层包。
然后对顶层包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推,直到最外层包被初始化。
等所有被导入的包加载完毕,就开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
Array & Slice & Map & Struct
Array
数组是值类型,当作为方法的入参传入时将复制一份数组而不是引用同一指针;
Slice
切片是数组的一个容量固定、长度可变的引用,因此切片是引用类型
slice 是一个指向array的指针。在传递切片时,等同于传递了一指针。
slice 可以自动扩容
Map
引用类型
Struct
值类型
range
作用于 string or map,可以返回系列 (key, value)
tag & String() & 类型断言
tag
在转换成其它数据格式的时候,会使用其中特定的字段作为键值
String()
如果Interface实现了String()这个方法,那么fmt中默认会调其用String()
类型断言
示例
reflect
reflect.Value.NumField(),获取结构体中字段的个数
reflect.Value.Method(n).Call(nil),调用结构体中的方法
reflect.TypeOf,返回一个Type类型值
reflect.Value.Kind,返回一个常量,表示变量的类别
reflect.ValueOf,返回一个Value类型值,该值代表运行时的数据
SetXX(x) 因为传递的是x的副本,所以SetXX不能够改x,要改动x必须向函数传递x的指针
goroutine
recover()
channel
chonlyread := make(<-chan int) //创建只读channel
chonlywrite := make(chan<- int) //创建只写channel
Last updated