Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-09 17:30:10917parcourir

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)
}

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
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer