变量类
- nil 只能赋值给指针、chan、func、interface、map 或 slice 类型的变量。
error 类型,它是一种内置接口类型,所以也能赋值nil
type error interface {
Error() string
}
- Go 是强类型语言
- 在Go语言中,结构体中的map[string]string类型不能直接进行比较。map[string]string类型是一个动态的键值对集合,它的值可以是任何类型的值,因此不能直接比较。比较这两个结构体中的map[string]string值。一种方法是使用reflect包中的DeepEqual函数来比较两个map的值。
- 相同类型的结构体才能够进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关,
- append() 的第二个参数不能直接使用 slice,需使用 … 操作符,将一个切片追加到另一个切片上
- 显式初始化是指在声明变量时,直接为变量分配一个初始值。这种初始化方式通常用于需要初始化值为特定值的情况。
在这个例子中,你试图将一个变量L添加到一个已存在的切片中。但是,你并没有为L分配一个初始值,所以编译器会报错。为了解决这个问题,你需要显式地为L分配一个初始值。例如:
L := []int{}
L = append(L, ...)
与显式初始化相对应的是默认初始化。默认初始化是指在声明变量时,为变量分配一个默认值。这种初始化方式通常用于需要变量有一个默认值的情况。
例如,在声明一个整数变量时,如果没有显式地指定初始值,那么它将被初始化为0:
var i int
在这个例子中,i被显式地初始化为0。如果你不显式地初始化i,那么它将被默认初始化为0。
- 字符串连接
str := "abc" + "123"
fmt.Sprintf("abc%d", 123)
除了以上两种连接方式,还有 strings.Join()、buffer.WriteString()等。
new() 与 make() 的区别
new(T) 会为 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T的值。换句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值。适用于值类型,如数组、结构体等。
make(T,args) 返回初始化之后的 T 类型的值,这个值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用。make() 只适用于 slice、map 和 channel.
编译、初始化相关操作
- defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
- init() 函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等;
- 一个包可以出线多个 init() 函数,一个源文件也可以包含多个 init() 函数;
- 同一个包中多个 init() 函数的执行顺序没有明确定义,但是不同包的init函数是根据包导入的依赖关系决定的(看下图);
- init() 函数在代码中不能被显示调用、不能被引用(赋值给函数变量),否则出现编译错误;
- 一个包被引用多次,如 A import B,C import B,A import C,B 被引用多次,但 B 包只会初始化一次;
-
引入包,不可出现死循坏。即 A import B,B import A,这种情况编译失败;