Maison  >  Article  >  développement back-end  >  Voici les pièges auxquels vous devez faire attention lorsque vous utilisez Go !

Voici les pièges auxquels vous devez faire attention lorsque vous utilisez Go !

藏色散人
藏色散人avant
2021-12-15 15:30:261573parcourir

Cet article est écrit par la rubrique golangtutorial pour vous présenter quelques pièges auxquels vous devez faire attention lors de l'utilisation de Go. J'espère qu'il sera utile aux amis dans le besoin !

Pièges de Go à noter

Pièges à noter

L'avantage de Go réside dans sa programmation coroutine pratique et ses solides performances en matière de traitement réseau. Cependant, afin de rechercher la simplicité d'utilisation, le langage Go est très différent des autres langages. Voici quelques principaux pièges auxquels il faut prêter attention :

1. Une classe peut accidentellement implémenter une interface (elle contient l'implémentation de celle-ci). interface). La sémantique de peut différer de ce qui est attendu par le contrat d’interface.

2. := et = sont faciles à confondre

3. Le problème de la valeur zéro de la classe. Si Map a une valeur nulle, elle peut être interrogée mais ne peut pas être attribuée 4. Le transfert de valeur des types de référence sera toujours modifié. la valeur originale. Quels sont les types de référence

5. Slice trap, si la capacité est suffisante, elle est passée par référence

6. valeur d'interface nulle

L'exemple de code de Pit 2~ Pit 6 est le suivant :

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()
}
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer