您好,登錄后才能下訂單哦!
本篇內容介紹了“使用Go需要注意哪些坑”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Go 需要注意的坑
需要注意的坑
Go 的優勢在于方便的協程編程,在網絡處理這一塊性能強。但是 Go 語言為了追求使用上的簡單,和其他語言有很多的不同,這里列出一些主要注意的坑:
1、類可能偶然實現了某個接口(它正好包含這個接口的實現),實現的語義可能與接口契約所期望的不同。
2、:= 和 = 容易混淆
3、類的零值問題,Map 如果是零值,它可以查詢但是不能賦值
4、引用類型的值傳遞,仍然會修改原始值。哪些是引用類型
5、slice 陷阱,容量足夠的情況下是引用傳遞
6、nil 接口值
坑 2~ 坑 6 的代碼示例如下:
package main import ( "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需要注意哪些坑”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。