Adresse temporaire en Aller?
Quelle est la façon la plus propre pour gérer un cas comme ceci:
func a() string {
/* doesn't matter */
}
b *string = &a()
Cela génère l'erreur:
ne peut pas prendre l'adresse d'un()
Ma compréhension est que Vont automatiquement favorise une variable locale au tas si son adresse est pris. Ici, il est clair que l'adresse de la valeur de retour est à prendre. Qu'est ce qu'un idiomatiques façon de gérer cela?
- Qu'avez-vous voulez atteindre avec la construction en question?
Vous devez vous connecter pour publier un commentaire.
L'adresse de l'opérateur renvoie un pointeur vers quelque chose d'avoir un "chez-soi", par exemple, une variable. La valeur de l'expression dans votre code est "sans-abri". si vous avez vraiment besoin d'un * * chaîne, vous devrez le faire en 2 étapes:
Note que bien que tout à fait valable, cas d'utilisation pour l' *chaîne, de nombreuses fois, c'est une erreur de les utiliser. Allez
string
est un type de valeur, mais un bon marché à passer (un pointeur et un entier (int). La chaîne de valeur est immuable, la modification d'une*string
changements où la "maison" points de, pas la chaîne de valeur, dans la plupart des cas*string
n'est pas du tout nécessaire.*string
dea()
&
opérateur a une "maison" (pas d'autre option possible, de toute façon, sinon il n'y aurait pas d'adresse pour prendre).Voir la section pertinente de la Langage Go de spec.
&
ne peut être utilisé sur:Ce que vous avez n'est ni de ceux-ci, de sorte qu'il ne fonctionne pas.
Je ne suis même pas sûr de ce qu'il voudrait dire, même si vous pouviez le faire. En prenant l'adresse de la suite d'un appel de fonction? Habituellement, vous passez un pointeur de quelque chose à quelqu'un parce que vous voulez être en mesure de céder à la chose de pointu et de voir les changements dans la variable d'origine. Mais le résultat d'un appel de fonction est temporaire; personne d'autre ne le "voit", à moins que vous l'attribuer à quelque chose d'abord.
Si le but de créer le pointeur est de créer quelque chose avec une dynamique de vie, semblable à
new()
ou de prendre l'adresse d'un composite littéral, alors vous pouvez affecter le résultat de l'appel d'une fonction à une variable et de prendre l'adresse de celui-ci.À la fin vous proposons d'Aller devrait vous permettre de prendre l'adresse d'une expression, par exemple:
Le cours compilateur imprime le message d'erreur:
cannot take the address of i + j
À mon avis, permettant au programmeur de prendre l'adresse de toute expression:
Il semble contre-productif pour compliquer le compilateur et le spec pour peu de gain.
Récemment, j'ai été ligoté dans des nœuds sur quelque chose de similaire.
Parlant d'abord des chaînes dans votre exemple est une source de distraction, l'utilisation d'une structure de la place, ré-écrit-il à quelque chose comme:
Ce ne compile pas car vous ne pouvez pas prendre l'adresse d'un(). Afin de faire ceci:
Cette compile, mais vous avez renvoyé une MyStruct sur la pile, accordé suffisamment d'espace sur le segment de mémoire pour stocker un MyStruct, puis de copier le contenu de la pile sur le tas. Si vous voulez éviter cela, alors l'écrire comme ceci:
La copie est normalement peu coûteux, mais ces structures pourrait être grand. Pire encore, lorsque vous souhaitez modifier la structure et de l'avoir "coller" vous ne pouvez pas copier puis de modifier les copies.
De toute façon, il devient d'autant plus de plaisir lorsque vous utilisez un type de retour d'interface{}. L'interface{} peuvent être la structure ou un pointeur vers une struct. La même copie de problème.
a()
ne pointe pas vers une variable comme il est sur la pile. Vous ne pouvez pas pointer vers la pile (pourquoi ?).Vous pouvez le faire si vous voulez
Mais ce que vos voulez vraiment atteindre est peu claire.
va
seront stockés sur le tas.va
seront stockés sur le tas à cause de l'adresse de l'opérateur sur la ligne suivante?suppose que vous avez besoin de l'aide de Plus efficace Rpc 😉
Temp obj et rvalue
Et de Primer Plus
En Aller lang, littéral de chaîne sera converti en
StrucType
objet, qui va être un non-adressable temp struct objet. Dans ce cas, littéral de chaîne ne peut pas être référencée par adresse en Aller.Bien, le dernier mais non le moins, une exception en aller, vous pouvez prendre l'adresse du composite littérale. OMG, quel gâchis.
Vous ne pouvez pas obtenir la référence de la suite directement lors de l'attribution d'une nouvelle variable, mais vous avez idiomatiques façon de le faire sans l'utilisation d'une variable temporaire (c'est inutile) tout simplement en pré-déclarer votre "b" pointeur - l'étape que vous avez manqué:
*b
est utilisé pour déréférencer le pointeur et d'accéder directement à la zone de mémoire qui détiennent vos données (sur le tas, bien sûr).Jouer avec le code: https://play.golang.org/p/VDhycPwRjK9