Golang常犯错误
1.Golang常犯错误
01.01~10
01.nil的slice和map
- 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。
02.判断map中key是否存在
- 当访问 map 中不存在的 key 时,Go 则会返回元素对应数据类型的零值,比如 nil、’’ 、false 和 0
- 取值操作总有值返回,故不能通过取出来的值,来判断 key 是不是在 map 中。
- 检查 key 是否存在可以用 map 直接访问,检查返回的第二个参数即可。
03.string值修改
- 不能,尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。
- string 类型的值是只读的二进制 byte slice,如果真要修改字符串中的字符
将 string 转为 []byte 修改后,再转为 string 即可
。
04.解析JSON数字转成float64
- 在 encode/decode JSON 数据时,Go 默认会将数值当做 float64 处理。
- 解析出来的 200 是 float 类型。
05.如何从 panic 中恢复
- 在一个 defer 延迟执行的函数中调用 recover ,它便能捕捉/中断 panic。
06.避免Goroutine泄露
- 可以通过 context 包来避免内存泄漏。
- 下面的 for 循环停止取数据时,就用 cancel 函数,让另一个协程停止写数据。
- 如果下面 for 已停止读取数据,上面 for 循环还在写入,就会造成内存泄漏。
07.跳出for select 循环
- 通常在for循环中,使用break可以跳出循环
- 但是注意在go语言中,for select配合时,break 并不能跳出循环。
08.嵌套结构初始化
- go 的哲学是组合优于继承,使用 struct 嵌套即可完成组合,内嵌的结构体属性就像外层结构的属性即可,可以直接调用。
- 注意初始化外层结构体时,必须指定内嵌结构体名称的结构体初始化,如下看到 s1方式报错,s2 方式正确。
09.defer触发顺序
- 看下答案,输出:
- 参考解析:defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
10.for循环&val取值错误
- 直接给答案:
- 参考解析:
- 这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用
- 所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址
- 因为最后 val 被赋值为3,所有输出都是3
- 正确的写法:
11.切片append错误
- 两段代码分别输出:
- 参考解析:这道题考的是使用 append 向 slice 添加元素,第一段代码常见的错误是 [1 2 3],需要注意。
02.11~20
12.new()返回指针
- 参考答案及解析:
- 不能通过编译,new([]int) 之后的 list 是一个
*[]int
类型的指针,不能对指针执行 append 操作。 - 可以使用 make() 初始化之后再用。
- 同样的,map 和 channel 建议使用 make() 或字面量的方式初始化,不要用 new() 。
- 不能通过编译,new([]int) 之后的 list 是一个
13. :=赋值只能在函数内部使用
- :=赋值不会影响外层函数值
14.数组用于函数传参时是值复制
- 注意:方法或函数调用时,传入参数都是值复制(跟赋值一致)
- 除非是
map、slice、channel、指针类型
这些特殊类型是引用传递
15.defer打印顺序
- 当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
Golang常犯错误
http://coderedeng.github.io/2022/04/20/Go进阶 - Golang常犯错误/