2016-06-01 7 views
1

インタフェースを実装する構造体を作成します。 別の構造体にカプセル化します。 struct/dereferenceを取得します。golang - 参照解除後に構造体からインタフェース実装インスタンスを取得

  1. フェッチは、インターフェイスの実装へのポインタを取得します。
  2. ポインタを間接参照すると、インターフェイスの別のポイントになります。

なぜインプリメンテーションへのポインタを参照解除すると実装インスタンスが得られないのですか?プロパティにアクセスしようとしている

package main 

import (
    "fmt" 
    "net/http" 

    "golang.org/x/net/http2" 
) 

func main() { 
    transport := &http2.Transport{} 
    client := &http.Client{Transport: transport} 

    tmp1 := client.Transport 
    tmp2 := &client.Transport 
    tmp3 := &tmp1 

    fmt.Printf("%T\n%T\n%T\n", tmp1, tmp2, tmp3) 

    //dialTLS := tmp1.DialTLS 
} 

このコードの出力...

*http2.Transport 
*http.RoundTripper 
*http.RoundTripper 

同様に、 tmp1コンパイルエラーになり...

tmp1.DialTLS undefined (type http.RoundTripper has no field or method DialTLS) 

dialTLS := tmp1.DialTLSのコメントを外します)。 ..でも、fmt.Printf("%+v", tmp1)出力...

&{DialTLS:<nil> TLSClientConfig:0xc8203ec8c0 ConnPool:<nil> DisableCompression:false MaxHeaderListSize:0 t1:<nil> connPoolOnce:{m:{state:0 sema:0} done:0} connPoolOrDef:<nil>} 

私がしようとしているのは、トランスポートインスタンスのDialTLSアクセスです。

答えて

3

ここでタイプの不一致があります。基になる型がRoundTripper実装*http2.Transportですが

type Client struct { 
    // Transport specifies the mechanism by which individual 
    // HTTP requests are made. 
    // If nil, DefaultTransport is used. 
    Transport RoundTripper 

    // ... 
} 

ので、tmp1のタイプは、http.RoundTripperです:あなたはドキュメントを見れば、あなたはClient構造体のフィールドTransportインターフェイスRoundTripperを返すことがわかりますインタフェース。

tmp2およびtmp3については、RoundTripperへのポインタであり、**http2.Transportではありません。

DialTLSフィールドを取得するためには、あなたが戻ってTransportRoundTripperを変換するタイプのアサーションを使用する必要があります。

dialTLS := client.Transport.(*http2.Transport).DialTLS 
+0

ああ、私は私の主張に 'http2.Transport'へのポインタを指定するために忘れてしまいました!どうもありがとう! – chaseisabelle

関連する問題