Je peux convertir un int vers un float64 comme ceci: en ce qui concerne les affirmations de type, les états GO effectifs: "Le type doit être le type concret détenu par l'interface, soit Un deuxième type d'interface que la valeur peut être converti en. ' p> dans cet esprit, pourquoi l'échec suivant: p> Ceci provoque un < Code> Panic: Conversion d'interface: Interface est int, pas float64 code>. p> Notez que la spécification Go indique: p> 'pour une expression x du type d'interface et un type T, l'expression primaire p> affirme que x n'est pas nul et que la valeur stockée dans x est de type t. ' P> qui contradict le Déclaration efficace Go, mais semble plus en ligne avec ce que je vois. P> p>
3 Réponses :
Cette phrase en fonction efficace va bien être déroutant. On dirait que l'auteur pensait aux structures à cette époque. P>
Le chapitre sur les assertions de la spécification est beaucoup plus clair: P>
pour une expression x de type d'interface et un type T, le primaire Expression p>
x. (t) affirme que x n'est pas nul et que la valeur stockée dans x est de Type T. La notation x. (t) s'appelle une affirmation de type. P>
Plus précisément, si t n'est pas un type d'interface, x. (t) affirme que le Le type dynamique de x est identique au type T. Dans ce cas, T doit Implémenter le type (interface) de x; Sinon, l'affirmation de type est invalide car il n'est pas possible pour X de stocker une valeur de type T. si T est un type d'interface, x. (T) affirme que le type dynamique de x implémente l'interface t. p> blockQuote>
Le fait Vous pouvez convertir votre intégrement vers un flotteur (et l'inverse) ne peut pas En tout moyen, vous pouvez affirmer qu'ils sont le même type. P>
Toutefois, comme suggéré par le message de panique de temps d'exécution, l'opération est en réalité une «conversion d'interface», par opposition à une affirmation. Ce serait bien si ce type de conversion pourrait se produire naturellement.
Vous pouvez faire un commutateur de type. Quoi de plus naturel avez-vous en tête?
@FerGuzz: Go est assez explicite dans toutes ses conversions, il y a non i> conversions implicites ou automatiques. C'est une très bonne chose. Les types de "conversions naturelles" sont le contraire totalement explicite.
Dis que je veux convertir n'importe quel type numérique en float64, ce serait le seul moyen? Play.golang.org/p/HQ5COOWDNT
Il pourrait y avoir une solution «plus simple» avec des bits de jeu (ou de petits piratage), mais si vous en avez besoin, vous pourriez avoir un problème de conception quelque part.
Le type doit soit être le type de béton maintenu par l'interface, soit une seconde interface Strong> Type que la valeur peut être convertie en p>
Ceci explique essentiellement le suivant : p>
xxx pré> l'affirmation TO
INT code> échoue car il s'agit d'un type fort> béton fort> (par opposition au type d'interface) qui n'est pas
* polymorphe code> lui-même. P> blockquote >
Vous pouvez uniquement taper l'affirmation du type d'interface au type sous-jacent. Dans ce cas int code>. Ensuite, vous utilisez la conversion de type de
int code> sur
float64 code> p>