web-dev-qa-db-ja.com

このキャストはgolangで行われますか?

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

ブラケットは何に使用されますか?この割り当て操作で何が起こっているのかわかりません。

この質問に答えるために、さらに詳細が必要ですか?

27
Varun Patro

これは Typeアサーション です。型アサーションは次の目的で使用できます。

  • interfacetypeの値からconcretetypeの値を取得する
  • または、differentインターフェースタイプの値を取得するために、最初のもの(異なる メソッドセット 、単純な型 conversion )を使用して簡単に取得できるため、実際には元のサブセットではありません。

仕様から引用:

インターフェイスタイプの式xおよびタイプTの場合、プライマリ式

_x.(T)
_

xnilではなく、xに格納されている値はT型であると断言します。表記x.(T)type assertionと呼ばれます。

より正確には、Tがインターフェース型でない場合、x.(T)は、xの動的型がT型に対して identical であることをアサートします。この場合、Tは、xの(インターフェース)型を implement する必要があります。それ以外の場合、xがタイプTの値を格納できないため、タイプアサーションは無効です。 Tがインターフェイスタイプの場合、x.(T)は、xの動的タイプがインターフェイスTを実装することをアサートします。

より具体的には、あなたの例は、型アサーションが成立するかどうかを報告する特別な形式です。そうでない場合、okfalseになり、アサーションが保持される場合、oktrueになります。

この特殊な形式は、次の形式とは異なりパニックに陥ることはありません。

_paxPayment = dataObject.(*entities.PassengerPayment)
_

dataObjectが_*entities.PassengerPayment_型の値を保持していない場合、パニックになります。

39
icza