Fermer

février 4, 2023

Allez pointeurs ! Parlons-en…

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 :

  1. Nous créons un animal, cat qui a des attributs définis dans le type animal .
  2. Maintenant, je veux mettre à jour myAnimal de cat à un cow. Pour ce faire, j’appelle ma fonction de récepteur cat.updateAttributes("cow", "mooooooooo") mettre à jour les attributs name et sound .
  3. 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 celui myAnimal .

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