GOLANG-易错细节记录
1、panic与defer关系以及多个defer的执行顺序;
panic在defer函数执行之后执行;多个defer则是按照先进后出的顺序执行。
2、关于使用make函数初始化切片注意点;
make([]int, 5) 表示使用make初始化一个切片,切片数据为int类型,切片内部初始化5个元素,初始值为int类型的零值即0;[0 0 0 0 0]
make([]string, 5) 表示使用make初始化一个切片,切片数据为string类型,切片内部初始化5个元素,初始值为string类型的零值即空字符串;[ ] 注意里面是空字符串,是有长度的。
3、可使用 == 或者 != 操作的数据类型;
布尔值具有可比性。两个布尔值是相等的,如果它们两者之一 true或两者都相等false。
整数值以通常的方式具有可比性和有序性。
根据 IEEE-754 标准的定义,浮点值具有可比性和有序性。
复数值具有可比性。两个复数值u和v相等,如果两者real(u) == real(v)和 imag(u) == imag(v)。
字符串值是可比较的和有序的,词法字节。
指针值是可比较的。如果两个指针值指向同一个变量或两者都有值,则它们相等nil。指向不同的零大小变量的指针可能相等,也可能不相等。
通道值具有可比性。如果两个通道值是由相同的调用创建的, make 或者两者都具有 value ,则它们是相等的nil。
接口值具有可比性。如果两个接口值具有相同的动态类型和相同的动态值,或者两者都具有值,则它们是相等的nil。
x非接口类型X的值 和t接口类型T的值在类型的值X是可比较的并且 X 实现 T时是可比较的。如果t的动态类型与 相同X 且t的动态值等于 ,则它们相等x。
如果结构值的所有字段都是可比较的,则结构值是可比较的。如果它们对应的非空白字段 相等,则两个结构值相等。
如果数组元素类型的值是可比较的,则数组值是可比较的。如果它们的对应元素相等,则两个数组值相等。
切片、map、函数等是不能比较的
官方文档:https://go.dev/ref/spec#Comparison_operators
4、关于变量nil值的相关类型赋值;
nil 只能赋值给指针、chan、func、interface、map 或 slice 类型的变量
5、关于类型选择语法:i.(type),中i必须为接口,否则不能使用该语法;
switch i.(type) {
case int:
println("int")
case string:
println("string")
case interface{}:
println("interface")
default:
println("unknown")
}
6、关于map获取不存在的key的值和删除不存在的key的值;
package main
import "fmt"
func main() {
m := make(map[string]string)
m["a"] = "1"
fmt.Println(m["b"]) // 获取map中不存在的key,如果map的value是int类型,返回的是0,如果是string则什么也不返回
delete(m, "c") // 删除map中不存在的key,不会报错
}
7、对数组或者切片进行切片;
数组[i:j:k] 注意:i 为开始位置(闭区间),j 为结束位置(开区间),k为容量,不能超过原数组;注意和python的语法区别,python和shell中k均为步长;
8、