Maison > développement back-end > Golang > Pourquoi renvoyer un pointeur au lieu d'une valeur dans la fonction « Nouvelle » de Go ?

Pourquoi renvoyer un pointeur au lieu d'une valeur dans la fonction « Nouvelle » de Go ?

Susan Sarandon
Libérer: 2024-12-24 02:30:11
original
581 Les gens l'ont consulté

Why Return a Pointer Instead of a Value in Go's

Comprendre l'utilisation du retour d'adresse dans les constructeurs Go : nouveau ou retour direct

Contrairement à d'autres langages qui fournissent des constructeurs explicites, Go utilise un Fonction "Nouvelle" à la place des constructeurs. Cependant, pourquoi est-il courant de renvoyer l'adresse (&f) dans la fonction "Nouveau" de Go, plutôt que de renvoyer directement l'objet File ?

Différences entre l'adresse et les retours directs

La syntaxe de Go permet de renvoyer soit des valeurs (non-pointeurs), soit des pointeurs, laissant la décision au développeur. En règle générale, un pointeur est renvoyé lorsque la valeur est plus utile qu'une seule. C'est particulièrement le cas si la valeur renvoyée :

1. Possède plusieurs méthodes avec des récepteurs de pointeur :

Le retour d'un pointeur permet d'enchaîner les appels de méthode directement sur l'objet renvoyé, même si les méthodes prennent un récepteur de pointeur. Cela élimine le besoin de stocker la valeur renvoyée dans une variable et d'appeler manuellement les méthodes.

2. Est stocké dans des structures de données non adressables :

Certaines structures de données, telles que les cartes, ne prennent pas en charge l'adressage direct des valeurs. Le renvoi d'un pointeur contourne cette limitation, permettant des appels de méthode sur la valeur stockée dans la structure de données.

3. Une grande structure est-elle fréquemment transmise :

Les pointeurs sont avantageux pour les grandes structures qui seront fortement transmises, car ils optimisent l'utilisation de la mémoire et les performances.

Exemple de comparaison :

Considérons une structure simple avec une méthode qui prend un pointeur récepteur :

type My int

func (m *My) Str() string { return strconv.Itoa(int(*m)) }

func createMy(i int) My { return My(i) }  // Direct return
func createMyPtr(i int) *My { return (*My)(&i) }  // Address return
Copier après la connexion

Lors de la tentative d'utilisation de la valeur de retour directe :

fmt.Println(createMy(12).Str())
Copier après la connexion

Une erreur se produit : "impossible d'appeler la méthode du pointeur sur createMy(12)". Cependant, avec l'adresse return :

fmt.Println(createMyPtr(12).Str())
Copier après la connexion

L'appel de méthode réussit sans erreur.

Conclusion :

La décision de renvoyer ou non un le pointeur ou la valeur directement dans la fonction "Nouveau" de Go est basé sur l'utilisation prévue de l'objet renvoyé. Les pointeurs offrent des avantages lorsqu'il s'agit de méthodes avec des récepteurs de pointeurs, des structures de données non adressables ou des structures volumineuses qui seront fréquemment transmises.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal