Artikel ini ditulis oleh ruangan tutorial golang untuk memperkenalkan anda kepada beberapa perangkap yang perlu anda perhatikan apabila menggunakan Go. Saya harap ia akan membantu rakan yang memerlukan!
Perangkap Go yang perlu diberi perhatian
Perangkap yang perlu diberi perhatian
Kelebihan Go ialah pengaturcaraan coroutine yang mudah dan prestasi yang kukuh dalam pemprosesan rangkaian. Walau bagaimanapun, untuk mengejar kesederhanaan penggunaan, bahasa Go sangat berbeza daripada bahasa lain Berikut adalah beberapa perangkap utama yang perlu diberi perhatian:
1 antara muka antara muka ini) pelaksanaan), semantik pelaksanaan mungkin berbeza daripada apa yang dijangkakan oleh kontrak antara muka.
2. := dan = mudah dikelirukan
3 Masalah nilai sifar kelas itu, ia boleh disoal tetapi tidak boleh diberikan
4. Jenis rujukan Jika nilai diluluskan, nilai asal masih akan diubah suai. Apakah jenis rujukan
5. Slice trap, jika kapasiti mencukupi, ia diluluskan oleh rujukan
6 nilai antara muka tiada
Pit 2~ Kod Pit 6 Contoh adalah seperti berikut:
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() }
Atas ialah kandungan terperinci Berikut ialah perangkap yang perlu anda perhatikan apabila menggunakan Go!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!