Maison > Article > développement back-end > Voici les pièges auxquels vous devez faire attention lorsque vous utilisez Go !
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!