この記事は、golang チュートリアル コラムによって提供され、Go を使用する際に注意する必要があるいくつかの落とし穴を紹介するものです。困っている友人の役に立てば幸いです。
注意すべき Go の落とし穴
注意すべき落とし穴
Go の利点は、その便利なコルーチン プログラミングとその便利さにあります。ネットワーク処理で強力なパフォーマンスを発揮します。ただし、使いやすさを追求するために、Go 言語は他の言語とは大きく異なります。注意すべき主な落とし穴は次のとおりです:
1. クラスが誤ってインターフェイスを実装する可能性があります (たまたま次のものが含まれています)。このインターフェイスのインターフェイス)実装)、実装のセマンティクスは、インターフェイス コントラクトで予期されるものと異なる場合があります。
2. := と = は混同しやすいです
3. クラスのゼロ値の問題。Map にゼロ値がある場合、クエリは実行できますが、代入はできません。
4. 参照型 値が渡された場合でも、元の値は変更されます。参照タイプは何ですか
5、スライス トラップ、容量が十分であれば、参照によって渡されます
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! を使用するときに注意する必要がある落とし穴は次のとおりです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。