Lors de l'écriture de programmes Go, nous rencontrons souvent le problème de résultats de sortie variables incorrects. Parfois, ce problème laisse les gens perplexes et ne savent pas comment le résoudre. Cet article explique pourquoi des valeurs de variable incorrectes se produisent et propose des solutions.
Dans les programmes Go, la portée des variables est contrôlée par des accolades {}. Si vous déclarez une variable dans une fonction et attribuez sa valeur à une autre variable, mais que l'autre variable est utilisée en dehors de la fonction, sa valeur ne sera pas correcte.
Par exemple, le programme suivant a ce problème :
func main() { a := 1 { a := 2 } fmt.Println(a) // 输出为1 }
Dans ce programme, nous déclarons deux variables a. La portée de la première variable a est la fonction principale entière, tandis que la portée de la seconde variable a est à l'intérieur des accolades {}. Nous avons attribué une valeur à la variable a à l'intérieur des accolades, mais lorsque la variable a est utilisée en dehors de la fonction, sa valeur reste la même.
Solution : Ne déclarez pas une variable portant le même nom que la variable externe à l'intérieur des accolades internes.
Go est un langage qui prend en charge la programmation simultanée. Si plusieurs coroutines Go accèdent à la même variable en même temps et qu'au moins une coroutine modifie la variable, le problème des valeurs de variable incorrectes se produira.
Par exemple, le programme suivant a ce problème :
func main() { var wg sync.WaitGroup var mu sync.Mutex a := 1 for i := 0; i < 10; i++ { wg.Add(1) go func() { mu.Lock() defer mu.Unlock() a++ wg.Done() }() } wg.Wait() fmt.Println(a) // 输出可能是10,也可能是11 }
Dans ce programme, nous utilisons le verrou fourni par le package sync pour protéger la variable a. Mais nous avons activé 10 coroutines en même temps pour modifier la variable a, ce qui entraînera des valeurs de variable incorrectes.
Solution : utilisez le mécanisme de verrouillage fourni par le package de synchronisation ou utilisez un canal pour coordonner l'accès entre les différentes coroutines.
Dans les programmes Go, la conversion de type est très courante. Mais parfois, la conversion de type peut entraîner des valeurs de variable incorrectes.
Par exemple, le programme suivant a ce problème :
func main() { var a uint32 = 1 var b uint64 = uint64(a) fmt.Println(b) // 输出为1,而不是4294967297 }
Dans ce programme, nous convertissons une variable entière non signée de 32 bits a en une variable entière non signée de 64 bits b. Mais nous nous attendons à ce que la valeur de sortie de b soit 4294967297, et non 1.
Solution : lors de la conversion de type, assurez-vous que le type cible peut s'adapter à la valeur du type source. De plus, lors de la conversion de types à virgule flottante en nombres entiers, il convient de prêter attention aux problèmes d'arrondi.
Résumé
Cet article explique pourquoi des valeurs de variable incorrectes se produisent et propose des solutions. Lors de l'écriture de programmes Go, nous devons prêter attention à la portée des variables, aux problèmes de concurrence et aux problèmes de conversion de type, afin d'éviter des valeurs de variables incorrectes.
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!