web-dev-qa-db-fra.com

Go ne parvient pas à déduire le type de l'affectation: "non-nom à gauche de: ="

Cet extrait fonctionne comme prévu play.golang.org/p/VuCl-OKMav

i := 10
next := 11
prev, i := i, next

Cependant, cet extrait presque identique donne non-name f.Bar on left side of :=play.golang.org/p/J8NNWPugQG

type Foo struct {
    Bar int
}

f := Foo{10}
next := 11
prev, f.Bar := f.Bar, next

Quelle est la particularité de la structure qui arrête l'inférence de type? Est-ce un bug?

25
deft_code

C'est une question ouverte.

Issue 6842 : spec: Affectation à des champs avec une notation de déclaration courte

18
peterSO

Ce n'est pas vraiment un problème d'inférence de type, c'est juste que le côté gauche de := doit être une liste d'identifiants et f.Bar n'est pas un identifiant, il ne peut donc pas être déclaré - pas même avec := règles légèrement plus permissives pour ce qu'il peut déclarer. Voir "Déclarations de variables courtes" dans La spécification du langage de programmation Go .

17
ruakh

Dans la section "Déclarations de variables courtes" de la spécification:

"Contrairement aux déclarations de variables régulières, une déclaration de variable courte peut redéclarer des variables à condition qu'elles aient été déclarées à l'origine plus tôt dans le même bloc ... avec le même type, et qu'au moins une des variables non vides soit nouvelle."

Donc si vous déclarez la variable dans un autre type (struct Foo dans l'exemple), elle est disqualifiée par "à condition qu'elles aient été déclarées à l'origine plus tôt dans le même bloc".

Donc, la réponse est de simplement mettre la variable pré-déclarée égale - sans utiliser la syntaxe: = - à la valeur:

...
var prev int
prev, f.Bar = f.Bar, next
...
7
Sean Williams