問題タブ [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.
go - インターフェイスで定義されていない型メソッドにアクセスするには?
実装者に Click メソッドが必要なインターフェイスがあります。ただし、このインターフェースを実装する型 FakeTicker は、Click メソッドに加えて Tick メソッドも実装しています。
ここで、「clocker.Tick undefined (type Ticker has no field or method Tick)」というエラーが表示されます。
インターフェイスにはメソッド Click() しかないことは理解していますが、FakeWriter がインターフェイスを実装しているので、独自のメソッド Tick() を呼び出すことができるはずではありませんか?
go - Golang インターフェース & *インターフェース
私が書いているゲームサーバーのコードベースでインターフェイスをもっと使用しようとしていますが、高レベルの概念といつ使用する必要があるかを理解しています (私は思います)。私の場合、それらを使用してパッケージを互いに切り離し、テストを容易にしています。
私の質問は、ptr receive メソッドを持つ構造体を持っているということです。次に、この遊び場のように、インターフェイスを介してこの構造体を別の関数に渡します。タイプ インターフェイスのパラメーターを持つ関数が、そのインターフェイスを実装する何かへのアドレスを受け入れることができる理由について混乱しています。なぜそうでないのですかfunc something(f *face)
、どのような目的に*interface
役立ちますか?
go - Golang 型アサーション / 中間構造体へのキャスト
次のタイプがあるとします。
eventHandleFunc
私の目標は、具体的なタイプActionSuccessEvent
、ActionFailureEvent
、およびより抽象的な のイベントハンドラー (タイプ ) を持つことActionResultEvent
です。ActionSuccessEvent
後者はs とs の両方に使用したいと思いActionFailureEvent
ます。
今、私の考えは、Event
私が取り組みたい構造へのインターフェースを型キャストすることであり、それは具象型に対してうまく機能します。
ActionResultEvent
では、 sを受け取るハンドラーはどうなるでしょうか。私の絶対的なお気に入りは次のようになります。
e
これは、タイプの場合と同様に明らかにパニックになりActionSuccessEvent
ます。
もちろん、初期型にキャストして中間型に戻すこともできます。
私のポイントからの別の本当に良いアプローチは次のとおりです。
誰でもスムーズな解決策を思いつくことができますか? 補足: 実行時に型キャストが失敗するたびにハンドラーがパニックに陥った場合、ラッパーがそれから回復するので、私は満足しています。
これは、上記のプレイグラウンドのコード例です。ありがとう!
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 のオブジェクトを返していますTransport
。Transport
インターフェイスはメソッドを指定しますWaitReceiveChannel()
。InboundTransport
も指定する自己定義のインターフェースがありますWaitReceiveChannel()
。私が呼び出しているサードパーティのメソッドはTransport
、 method を介して実装するオブジェクトを返しますWaitReceiveChannel()
。InboundTransport
後者もWaitReceiveChannel()
同じ型の a を指定しているので、それも実装すると思いました。これは機能していません。なぜだめですか?