Comparaison de tableaux de structures vides : comprendre le comportement des variables
Lorsque vous comparez des tableaux de structures vides dans Go, vous pouvez rencontrer des résultats inattendus. Explorons ce comportement à travers des exemples de code et comprenons pourquoi il se produit.
Considérez le code suivant :
var s, ss struct{} // two empty structs arr1 := [6]*struct{}{&s} // array with empty struct pointer arr2 := [6]*struct{}{&ss} // array with empty struct pointer fmt.Println(&s == &ss, arr1 == arr2) // false, true
Ici, nous définissons les structures vides s et ss, initialisons les tableaux arr1 et arr2 avec des pointeurs vers ces structures et imprimez les résultats de la comparaison. Étonnamment, même si &s et &ss ne sont pas égaux, arr1 et arr2 sont égaux.
Pour comprendre cela, nous devons nous référer aux spécifications Go. La spécification des valeurs de pointeur indique qu'elles sont égales si elles pointent vers la même variable ou si les deux ont une valeur nulle. Surtout, il note que les pointeurs vers des variables distinctes de taille nulle « peuvent être égaux ou non ».
De plus, les structures sans champs ont une taille nulle. Par conséquent, &s et &ss pointent vers des variables distinctes de taille nulle, et la comparaison &s == &ss peut être évaluée comme vraie ou fausse.
De même, le comportement de la comparaison de tableaux arr1 == arr2 n'est pas garanti. La spécification des variables de taille nulle indique qu'elles "peuvent" avoir la même adresse en mémoire. Ainsi, arr1 et arr2 peuvent être égaux ou non, et le résultat peut varier selon les différentes exécutions du programme.
Pour résumer, comparer des pointeurs à des variables distinctes de taille nulle, telles que des structures vides, peut donner des résultats imprévisibles. résultats. Bien que vous puissiez observer un résultat particulier une fois, il peut différer lors des exécutions ultérieures en raison de la manière dont le compilateur optimise l'allocation de mémoire.
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!