オブジェクトAにフィールドがnet.Dialer
であるとします。私はnet.Dialer
のカスタム実装をオブジェクトAに提供して、Dial
メソッドを補完したいと思います。これはGoで可能か?私はそうのようなembedded fieldsを使用しようとしている:Goを構造体に拡張する
package main
import (
"net"
"fmt"
)
type dialerConsumer struct {
dialer net.Dialer
}
func (dc *dialerConsumer) use() error {
conn, e := dc.dialer.Dial("tcp", "golang.org:http")
if e != nil {
return e
}
fmt.Printf("conn: %s\n", conn)
return nil
}
type customDialer struct {
net.Dialer
}
func main() {
standardDialer := net.Dialer{}
consumer := &dialerConsumer{
dialer: standardDialer,
}
consumer.use()
/*
customDialer := customDialer{
net.Dialer{},
}
consumer = &dialerConsumer{
dialer: customDialer,
}
consumer.use()
*/
}
私はmain
でコメントアウトコードのコメントを外したときにしかし、私は次のコンパイルエラーが表示されます。
src/test.go:38: cannot use customDialer (type customDialer) as type net.Dialer in field value
私はそれを正しく読んでいる場合は、残念ながら、 'net.Dialer'は、構造体として定義されて、答えを感謝していないインタフェース:https://golang.org/pkg/net /#Dialerまた、オブジェクトAを制御することはできないので、Dialerのパブリックメソッドである 'Dial'と' DialContext'を含む新しいインタフェースを使用するように変更することはできません。 –
'A'を制御できない場合は' Dialer'インターフェースを割り当てることはできません。またGoで 'net.Dialer'以外のものを 'net'型のフィールドに割り当てることはできません。 Dialer' ...次に最も良いことは、オブジェクト 'A'をラップし、' Dial'を呼び出す前に何をしなくてもいいことです。 – mkopriva
はい、私はあなたが正しいと思う、ラッピングAは現時点で私の唯一の選択肢のようだ。フィードバックをお寄せいただきありがとうございます! –