問題タブ [go-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1421 参照

go - インターフェイスで定義されていない型メソッドにアクセスするには?

実装者に Click メソッドが必要なインターフェイスがあります。ただし、このインターフェースを実装する型 FakeTicker は、Click メソッドに加えて Tick メソッドも実装しています。

ここで、「clocker.Tick undefined (type Ticker has no field or method Tick)」というエラーが表示されます。

インターフェイスにはメソッド Click() しかないことは理解していますが、FakeWriter がインターフェイスを実装しているので、独自のメソッド Tick() を呼び出すことができるはずではありませんか?

0 投票する
1 に答える
672 参照

go - Golang インターフェース & *インターフェース

私が書いているゲームサーバーのコードベースでインターフェイスをもっと使用しようとしていますが、高レベルの概念といつ使用する必要があるかを理解しています (私は思います)。私の場合、それらを使用してパッケージを互いに切り離し、テストを容易にしています。

私の質問は、ptr receive メソッドを持つ構造体を持っているということです。次に、この遊び場のように、インターフェイスを介してこの構造体を別の関数に渡します。タイプ インターフェイスのパラメーターを持つ関数が、そのインターフェイスを実装する何かへのアドレスを受け入れることができる理由について混乱しています。なぜそうでないのですかfunc something(f *face)、どのような目的に*interface役立ちますか?

0 投票する
1 に答える
789 参照

go - Golang 型アサーション / 中間構造体へのキャスト

次のタイプがあるとします。

eventHandleFunc私の目標は、具体的なタイプActionSuccessEventActionFailureEvent、およびより抽象的な のイベントハンドラー (タイプ ) を持つことActionResultEventです。ActionSuccessEvent後者はs とs の両方に使用したいと思いActionFailureEventます。

今、私の考えは、Event私が取り組みたい構造へのインターフェースを型キャストすることであり、それは具象型に対してうまく機能します。

ActionResultEventでは、 sを受け取るハンドラーはどうなるでしょうか。私の絶対的なお気に入りは次のようになります。

eこれは、タイプの場合と同様に明らかにパニックになりActionSuccessEventます。

もちろん、初期型にキャストして中間型に戻すこともできます。

私のポイントからの別の本当に良いアプローチは次のとおりです。

誰でもスムーズな解決策を思いつくことができますか? 補足: 実行時に型キャストが失敗するたびにハンドラーがパニックに陥った場合、ラッパーがそれから回復するので、私は満足しています。

これは、上記のプレイグラウンドのコード例です。ありがとう!

0 投票する
1 に答える
170 参照

go - goインターフェースでポリモーフィズムを実装しようとしています

サードパーティのライブラリ (この場合はlibchan ) の上にレイヤーを作成しようとしています。私が定義したインターフェースは次のとおりです。

InboundTransportは type の代用となるように意図されていますTransport:

文脈上、これがlibchan.Receiver定義です (これは my と一致することに注意してくださいReceiverStream:

これは、ここTransportで libchan ライブラリによって返されます。

libchan.TransportメソッドをInboundTransport共有しているのでWaitReceiveChannel() (ReceiverStream, error)、次のように、一方を他方にサブスクライブできるはずだと考えました。

しかし、私はエラーが発生します:

このエラーが意味するのは、の型がReceiverStream一致しないlibchan.Receiverということだと思いますが、golang インターフェイスは暗黙的であり、戻り値の型が期待されるインターフェイスと同じメソッドを実装している限り、コンパイルに合格すると思いました。サード パーツ ライブラリによって返されたインターフェイスに自己定義インターフェイスを重ね合わせることができるように、変更できるものはありますか?

TLDR: サードパーティの lib が interface のオブジェクトを返していますTransportTransportインターフェイスはメソッドを指定しますWaitReceiveChannel()InboundTransportも指定する自己定義のインターフェースがありますWaitReceiveChannel()。私が呼び出しているサードパーティのメソッドはTransport、 method を介して実装するオブジェクトを返しますWaitReceiveChannel()InboundTransport後者もWaitReceiveChannel()同じ型の a を指定しているので、それも実装すると思いました。これは機能していません。なぜだめですか?