semble que vous voulez toujours que ceci: au lieu de cette p> Si oui, alors le moyen d'obtenir le L'ancienne sémantique doit em> à utiliser cette dernière syntaxe. I.e. Les récepteurs doivent être passés par référence. P> p>
3 Réponses :
C'est parce que tout en va passer par valeur . Cela rend conforme aux autres langues familiales C et signifie que vous n'avez jamais besoin de vous rappeler si la situation que vous envisagez est de la valeur ou non.
de ce lien: P>
Comme dans toutes les langues de la famille C, tout en déplacement est transmis par la valeur. C'est-à-dire qu'une fonction reçoit toujours une copie de la chose qui est passée, comme s'il y avait une déclaration d'affectation attribuant la valeur au paramètre. Par exemple, le passage d'une valeur INT à une fonction fait une copie de l'INT, et la transmission d'une valeur de pointeur rend une copie du pointeur, mais pas les données qu'il pointaient. (Voir la section suivante pour une discussion sur la manière dont cela affecte les récepteurs de la méthode.) P> blockquote>
puis plus tard: p>
func (s *MyStruct) pointerMethod() { } // method on pointer func (s MyStruct) valueMethod() { } // method on value
Tout dans la deuxième citation me suggère que dans un bon design, presque chaque récepteur devrait être un pointeur. Le seul cas qu'il mentionne où vous pourriez envisager d'utiliser un non-pointeur est lorsque la valeur est petite. Généraliser pour des raisons de la petite valeur au prix de décourager de bonne conception ne semble pas être un bon choix.
Le choix pris est a) naturel à ceux avec C code> fond (et aller code> est assez inférieur que, disons, java code> ou .NET code>, et b) offre plus de liberté au programmeur. Développer sur le dernier point, Go code> vous permet d'accéder à une valeur via un pointeur en appliquant simplement l'opérateur de points (. Code>) au nom de ce pointeur, sans utiliser Tout opérateur de déséroférence ( * code>), donc si vous pensez que c'est un problème pour vous, utilisez toujours des récepteurs de pointeur lorsque le code à l'intérieur de vos méthodes ne sera pas plus difficile à écrire (pas de sur-usage de * code> s et -> code> s comme dans c code> ou c ++ code>).
@kostix ne doit pas avoir à faire -> est une autre raison pour laquelle les récepteurs non-pointeurs ont peu de sens. Go est beaucoup plus comparable à Java qu'à C: Collection de déchets, interfaces, sécurité, concurrence.
Parfois, vous ne voulez pas em> vouloir passer par référence. La sémantique de peut être utile si, par exemple, vous avez un petit objet immuable. L'appelant peut savoir avec certitude que cette méthode ne modifie pas la réception. Ils ne peuvent pas em> savent ceci si le conviever est un pointeur sans lire le code en premier. P> pour développer sur celui, par exemple P> // accessor for things Config
func (self Thing) GetConfig() *Config {
}
C'est pourquoi aller devrait avoir const: p
Vous ne savez pas que GetConfig renvoie la même config. Ce n'est que s'il n'essaie pas d'accéder à Global State E.G. le générateur de nombres aléatoires du système.
La copie ne doit pas être utilisée comme défense contre la modification. Cela fonctionne, mais il a des coûts de performance importants (cachés).
On dirait que tu veux toujours ceci: p> blockQuote>
non. Le récepteur de valeur est plus général. Il peut être utilisé dans tous les endroits qu'un récepteur de pointeur peut; Mais un récepteur de pointeur ne peut pas être utilisé dans tous les endroits qu'un récepteur de valeur peut - par exemple, si vous avez une expression de rvalue du widget de type
code>; Vous pouvez appeler des méthodes de récepteur de valeur sur celle-ci, mais pas les méthodes de l'indicateur de pointeur. P>
Cela semble être un anti-motif. On dirait que vos expressions devraient être de type * widget. Sinon, vous allez probablement finir par la copie involontaire de nombreux données.
Vous ne pouvez pas utiliser de récepteur de valeur lorsque vous souhaitez modifier l'objet lui-même, non? Donc, vous ne pouvez pas toujours i> utiliser un récepteur de valeur.
@KoryLprince: Ce n'est pas ce que je voulais dire par "peut être utilisé". Ce que je voulais dire était, étant donné que vous avez une méthode avec un récepteur de valeur et un procédé avec un récepteur de pointeur, il existe des contextes d'expression où vous ne pouvez pas (comme cela ne compile pas) Utilisez la méthode avec le récepteur de pointeur, mais où vous pouvez utiliser la méthode avec récepteur de valeur. Bien sûr, certaines choses ne peuvent pas être faites avec des méthodes avec des récepteurs de valeur. Mais ce n'est pas la question de la question. La question pose une question sur une méthode de récepteur de valeur hypothétique et demande si elle doit toujours être réalisée du pointeur.