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、