1. ホーム
  2. go

[解決済み] このキャスティングはgolangで行われているのでしょうか?

2022-03-05 16:52:48

質問

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

括弧は何に使うのでしょうか?この代入の操作で何が起こっているのかよくわかりません。

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

解決方法は?

それは タイプアサーション . タイプアサーションは、以下のように使用することができます。

  • の値を取得します。 コンクリート 型の値から インターフェース タイプ
  • の値を取得したり 異なる のインターフェイスの種類を変更することができます。 メソッドセット のサブセットではなく、単純な型を使って得ることができます。 変換 ).

仕様書から引用します。

式の場合 x のインターフェース型と T の場合、一次式

x.(T)

は次のように主張しています。 xnil に格納されている値が x は、型が T . この表記は x.(T) というのは タイプアサーション .

より正確には、もし T がインターフェース型でない場合。 x.(T) は、動的な型であることを主張しています。 x 同一 というタイプに T . この場合 T インプリメント の(インターフェイス)タイプは x そうでない場合、型アサーションは無効です。 x という型の値を格納するために T . もし T はインターフェース型です。 x.(T) は、動的な型であることを主張します。 x を実装しています。 T .

具体的には、あなたの例は、型アサーションが成立しているかどうかも報告する特殊な形です。そうでない場合は ok は次のようになります。 false , そして、アサーションが成立すれば ok になります。 true .

の形と違って、この特別な形は決してパニックにならない。

paxPayment = dataObject.(*entities.PassengerPayment)

もし dataObject 型の値を保持していない *entities.PassengerPayment はパニックになります。