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()}
以上就是使用go你需要注意的坑在这里!的详细内容。
