温馨提示  2024年 6月我们已经停止开发者板块文章内容更新,谢谢来访。存档数据
知识 2023-08-27 39 次阅读

使用go你需要留意的坑在这里!

    本文由golang教程栏目给大家介绍使用go需要留意的一些坑,希望对需要的朋友有所帮助!

go 需要留意的坑

需要留意的坑

go 的优势在于方便的协程编程,在网络处理这一块性能强。但是 go 语言为了追求使用上的简单,和其他语言有很多的不同,这里列出一些主要注意的坑

1. 类可能偶然实现了某个接口(它正好包含这个接口的实现),实现的语义可能与接口契约所期望的不同。

2. := 和 = 容易混淆

3. 类的零值问题,map 如果是零值,它可以查询但是不能赋值

4. 引用类型的值传递,仍然会修改原始值。哪些是引用类型

5. slice 陷阱,容量足够的情况下是引用传递

6. nil 接口值

坑 2~ 坑 6 的代码示例如下

package mainimport ( fmt time)func catcherror() { if err := recover(); err != nil { fmt.println(err) }}func hole2() { a := 1 if time.now().year() > 2020 { a := 2 // 一不小心加了一个冒号 println(a) } println(a)}func hole3() { defer catcherror() var m0 map[string]string println(key:, m0[key]) m0[key] = val // 报错assignment to entry in nil map}type hole4 struct { name string slices []string mymap map[string]string channel chan int}func hole4() { a := hole4{ name: a, slices: []string{a}, mymap: map[string]string{key: a}, channel: make(chan int), } go func() { for n := range a.channel { fmt.println(n) } }() b := a b.name = b b.slices[0] = b b.mymap[key] = b b.channel <- 999 fmt.println(a) fmt.println(b)}func hole5() { slice1 := make([]string, 1, 1) slice1[0] = 1 temp1 := slice1 temp1 = append(temp1, 1) temp1[0] = 2 fmt.println(slice1) slice9 := make([]string, 1, 9) slice9[0] = 1 temp2 := slice9 temp2 = append(temp2, 1) temp2[0] = 2 fmt.println(slice9)}type cache interface { name()}type rediscache struct{}func (rediscache) name() {}func hole6() { defer catcherror() var redis1 *rediscache = nil var redis2 cache = redis1 if redis2 != nil { println(entering...) redis2.name() // 报错nil pointer dereference }}func main() { hole2() hole3() hole4() hole5() hole6()}