Is this casting in golang?

GoTypesType Conversion

Go Problem Overview


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

What are the brackets used for? I'm not sure what is going on in this assignment operation.

Do you need any more details to answer this question?

Go Solutions


Solution 1 - Go

It's a Type assertion. A type assertion can be used to:

  • obtain a value of concrete type from a value of interface type
  • or to obtain a value of a different interface type than the initial one (an interface with a different method set, practically not subset of the original one as that could simply be obtained using a simple type conversion).

Quoting from the spec:

> For an expression x of interface type and a type T, the primary expression > > x.(T) > > asserts that x is not nil and that the value stored in x is of type T. The notation x.(T) is called a type assertion. > > More precisely, if T is not an interface type, x.(T) asserts that the dynamic type of x is identical to the type T. In this case, T must implement the (interface) type of x; otherwise the type assertion is invalid since it is not possible for x to store a value of type T. If T is an interface type, x.(T) asserts that the dynamic type of x implements the interface T.

More specifically your example is a special form of it which also reports whether the type assertion holds. If not, ok will be false, and if the assertion holds, ok will be true.

This special form never panics unlike the form of:

paxPayment = dataObject.(*entities.PassengerPayment)

Which if dataObject does not hold a value of type *entities.PassengerPayment will panic.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVarun PatroView Question on Stackoverflow
Solution 1 - GoiczaView Answer on Stackoverflow