Maison > développement back-end > Golang > Pourquoi ne pouvons-nous pas attribuer une valeur lorsque nous renvoyons une structure au lieu d'un pointeur vers une structure ?

Pourquoi ne pouvons-nous pas attribuer une valeur lorsque nous renvoyons une structure au lieu d'un pointeur vers une structure ?

WBOY
Libérer: 2024-02-09 17:30:10
avant
995 Les gens l'ont consulté

Pourquoi ne pouvons-nous pas attribuer une valeur lorsque nous renvoyons une structure au lieu dun pointeur vers une structure ?

En langage C, lorsque nous renvoyons une structure au lieu d'un pointeur vers la structure, la raison pour laquelle nous ne pouvons pas attribuer directement la valeur est que lors du retour de la structure, le contenu de la structure entière sera copié au lieu de renvoyer le pointeur vers le pointeur du corps. Étant donné qu’une structure peut contenir une grande quantité de données, la copie de la structure entière peut s’avérer coûteuse. Ainsi, afin d'améliorer l'efficacité, le langage C stipule que lorsqu'une structure est renvoyée, on ne peut l'utiliser qu'en l'attribuant à une variable de type structure. Cela peut éviter les opérations de copie inutiles et améliorer l'efficacité de l'exécution du code.

Contenu de la question

Supposons que nous ayons la structure suivante

type profile struct {
    id   int
    name string
}

func test(p profile) profile {
    return p
}

func main() {
    var profile profile
    test(profile).id = 20 // cannot assign to test(profile).id (value of type int)
}
Copier après la connexion

Mais si nous testons le type de retour de la fonction profile 更改为 *profile, la fonction principale fonctionnera.

func test(p Profile) *Profile {
    return &p
}

func main() {
    var profile Profile
    test(profile).id = 20 // Works
}
Copier après la connexion

Pourquoi est-ce ?

Solution de contournement

Attribuer des champs à Profile de cette manière n'a aucun effet notable. Vous allouez une valeur de structure temporaire (d'un champ), puis vous la supprimez immédiatement. Notez que la valeur de retour du test est une copie du profil dans main ; elle est copiée dans les paramètres du test, puis copiée à nouveau au retour du test.

Lors du retour d'un pointeur, au moins en principe, la structure pointée sera toujours accessible après l'affectation (mais pas dans ce cas particulier, puisque le pointeur pointe vers une copie de l'argument testé).

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal