web-dev-qa-db-fra.com

Ce casting est-il à Golang?

paxPayment, ok = dataObject.(*entities.PassengerPayment)

À quoi servent les supports? Je ne sais pas ce qui se passe dans cette opération d'affectation.

Avez-vous besoin de plus de détails pour répondre à cette question?

27
Varun Patro

C'est un Type assertion . Une assertion de type peut être utilisée pour:

  • obtenir une valeur de type concret à partir d'une valeur de type interface
  • ou pour obtenir une valeur d'un type d'interface différent de celui initial (une interface avec un ensemble de méthodes différent , pratiquement pas un sous-ensemble de l'original car cela pourrait simplement être obtenu en utilisant un type simple conversion ).

Citant de la spécification:

Pour une expression x de type interface et un type T, l'expression principale

x.(T)

affirme que x n'est pas nil et que la valeur stockée dans x est de type T. La notation x.(T) est appelée une assertion de type .

Plus précisément, si T n'est pas un type d'interface, x.(T) affirme que le type dynamique de x est identique au type T. Dans ce cas, T doit implémenter le type (interface) de x; sinon l'assertion de type n'est pas valide 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.

Plus précisément, votre exemple en est une forme spéciale qui indique également si l'assertion de type est valable. Sinon, ok sera false, et si l'assertion est vraie, ok sera true.

Cette forme spéciale ne panique jamais contrairement à la forme de:

paxPayment = dataObject.(*entities.PassengerPayment)

Ce qui si dataObject ne contient pas de valeur de type *entities.PassengerPayment Paniquera.

39
icza