Allez pointeurs ! Parlons-en…

UN aiguille, comme son nom l’indique, est une variable qui pointe vers un emplacement dans la mémoire de votre système où une valeur est stockée plutôt qu’une valeur elle-même. Fondamentalement, il s’agit d’une adresse à la valeur stockée en mémoire. La définition est simple, mais ce concept peut être un peu difficile à comprendre.
Lorsque j’ai développé pour la première fois une bonne compréhension des pointeurs en Go, je me suis demandé : « Comment puis-je expliquer ce concept à un enfant de 5 ans ? Eh bien, je ne sais pas si je peux trouver les mots pour expliquer cela à un enfant de 5 ans, mais je vais quand même essayer de vous donner une compréhension simpliste et complète.
Écrivons un petit bout de code :
package main
import "fmt"
type animal struct {
name string
sound string
}
func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}
myAnimal.updateAttributes("Cow", "Mooooooooo")
myAnimal.print("Updated Structure")
}
func (p animal) updateAttributes(newName string, sound string) {
p.name = newName
p.sound = sound
}
func (p animal) print(text string) {
result := fmt.Sprintf("%s ==> %+v \n \n", text, p)
fmt.Printf("%+v", result)
}
Décomposons cela :
- Nous créons un animal,
cat
qui a des attributs définis dans le typeanimal
. - Maintenant, je veux mettre à jour
myAnimal
decat
à uncow
. Pour ce faire, j’appelle ma fonction de récepteurcat.updateAttributes("cow", "mooooooooo")
mettre à jour les attributsname
etsound
. - Enfin, j’ai invoqué une autre fonction de récepteur
print
pour imprimer mon animal mis à jour.
Lançons notre module go en utilisant go run .
:
//Output: Updated Structure ==> { name:Cat sound:Meeeaaawwwwww zooInfo:{ town:California email:abc@xyz.com pinCode:12345 } }
Oups… comme vous pouvez le voir, mon animal est toujours un cat
.
Voyons ce qui est imprimé dans la fonction receiver :
func (p animal) updateAttributes(newName string, sound string) {
p.name = newName
p.sound = sound
p.print("Tadaaa")
}
Tadaaaa ==> {
name:cow
sound:Mooooooooo
}
Voici ce qui se passe en arrière-plan :
En bref, Go crée un tout nouveau struct
lorsqu’un myAnimal
est passé d’une fonction à une autre et p
l’argument de la fonction réceptrice devient un nouveau struct
tout à fait.
Autrement dit,
p
a sa valeur stockée dans un emplacement de mémoire différent de celuimyAnimal
.
Pour apporter des modifications à l’original struct
on peut utiliser *
et &
les opérateurs.
L’opérateur ‘*’ et ‘&’
Modifions un peu notre fonction principale et notre fonction réceptrice updateAttributes :
func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}
myAnimal.print("Original Structure")
myAnimalPointer := &myAnimal
myAnimalPointer.updateAttributes("Dog", "Woof Woof Woof")
myAnimal.print("Updated Struct")
}
func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}
Parlons de la fonction « main » : Création d’un pointeur
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww"
}
myAnimalPointer := &myAnimal
myAnimalPointer.updateAttributes("Dog", "Woof Woof Woof")
//OR We can simply do something like
(&myAnimal).updateAttributes("Dog", "Woof Woof Woof") //Same thing!
myAnimal.print("Updated Struct")
}
En utilisant le &
opérateur, nous pouvons créer un pointeur et nous pouvons obtenir l’adresse en mémoire où la valeur de la myAnimal
est stocké. Nous avons assigné &myAnimal
pointeur vers myAnimalPointer
variable.
Parlons de la fonction réceptrice « updateAttributes » : Récupération de la valeur du pointeur
func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}
p
est le pointeur que la fonction reçoit lorsqu’elle est invoquée.
*animal
n’est pas un pointeur mais une simple description de ce que cette fonction attend lorsqu’elle est invoquée.
La valeur en mémoire de ce pointeur p
références à, peut être consulté à l’aide de la *
opérateur.
A l’aide de parenthèses, (*p)
vous donnera accès au struct
les attributs.
Exécutons à nouveau le code :
go run .
Original Structure ==> {name:Cat sound:Meeeaaawwwwww}
Updated Struct ==> {name:Dog sound:Woof Woof Woof}
Woohooo 🎉… nous avons mis à jour la structure originale myAnimal avec la puissance des pointeurs.
Un moment Gotcha…
« abracadabra », laissez apparaître le code…
func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}
myAnimal.print("Original Structure")
myAnimal.updateAttributes("Dog", "Woof Woof Woof")
myAnimal.print("Updated Struct")
}
func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}
Go s’occupe automatiquement de la création du pointeur en arrière-plan afin que vous n’ayez pas à le faire. Et voilà comment, vous obtiendrez le même résultat :
go run .
Original Structure ==> {name:Cat sound:Meeeaaawwwwww}
Updated Struct ==> {name:Dog sound:Woof Woof Woof}
Le nouveau mot clé
Créons un pointeur à l’aide d’un new
mot-clé:
package main
import "fmt"
type animal struct {
name string
sound string
}
func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}
func main() {
myAnimal := new(animal)
myAnimal.updateAttributes("Dog", "Woof Woof Woof")
fmt.Printf("%+v", *myAnimal)
}
{name:Dog sound:Woof Woof Woof}%
Définition officielle :
Le
new
prend le type comme argument, alloue suffisamment de mémoire pour contenir une valeur de ce type et renvoie un pointeur vers celui-ci.
J’espère que j’ai pu rendre ce concept un peu plus facile à saisir pour tous mes adorables lecteurs et followers comme vous. Si vous pensez que quelque chose peut être amélioré, veuillez laisser un commentaire et je l’examinerai.
Passez une bonne journee!
. . .
Note de remerciement ❤️
Merci pour la visite. J’espère que vous trouverez cet article utile. S’il te plaît suis-moi sur moyen et aidez-moi à atteindre 1 000 abonnés 🙏🏻. Cela m’encouragera vraiment à publier plus de contenu.
PS: Si vous pensez que quelque chose peut être amélioré ou manque d’explications appropriées, envoyez-moi une note dans la zone de commentaire ou envoyez-moi un e-mail à shiva.chaturvedi91@gmail.com. Après tout, tu peux aussi m’apprendre une chose ou deux.
TROUVÉ CELA UTILE ? PARTAGEZ-LE
Source link