9
votes

GO TYPE ASSERTION CONVERSION

Je peux convertir un int vers un float64 comme ceci: xxx

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. '

dans cet esprit, pourquoi l'échec suivant: xxx

Ceci provoque un < Code> Panic: Conversion d'interface: Interface est int, pas float64 .

Notez que la spécification Go indique:

'pour une expression x du type d'interface et un type T, l'expression primaire xxx

affirme que x n'est pas nul et que la valeur stockée dans x est de type t. '

qui contradict le Déclaration efficace Go, mais semble plus en ligne avec ce que je vois.

go

0 commentaires

3 Réponses :


9
votes

Cette phrase en fonction efficace va bien être déroutant. On dirait que l'auteur pensait aux structures à cette époque.

Le chapitre sur les assertions de la spécification est beaucoup plus clair:

pour une expression x de type d'interface et un type T, le primaire Expression

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.

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.

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.


5 commentaires

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 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.



9
votes

Le type doit soit être le type de béton maintenu par l'interface, soit une seconde interface Type que la valeur peut être convertie en

Ceci explique essentiellement le suivant : xxx

l'affirmation TO INT échoue car il s'agit d'un type béton (par opposition au type d'interface) qui n'est pas * polymorphe lui-même.


0 commentaires

1
votes

Vous pouvez uniquement taper l'affirmation du type d'interface au type sous-jacent. Dans ce cas int . Ensuite, vous utilisez la conversion de type de int sur float64


0 commentaires