2016-06-01 5 views
1

인터페이스를 구현하는 구조체를 만듭니다. 다른 구조체로 캡슐화하십시오. struct/dereference를 가져옵니다.golang - 참조 해제 후 struct에서 인터페이스 구현 인스턴스를 가져옵니다.

  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을 반환 것을 볼 수 있습니다 인터페이스.

tmp2tmp3에 대해서는 이 아닌 RoundTripper에 대한 포인터로 간주됩니다. DialTLS 필드를 검색하기 위해

, 당신은 Transport에 다시 RoundTripper을 변환하는 타입 주장을 사용해야합니다 :

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

아, 내 주장에'http2.Transport'에 포인터를 지정하는 것을 잊었다! 많은 감사합니다! – chaseisabelle