2016-06-29 4 views
0

클라이언트 ID를 net.Conns (인터페이스)에 매핑하는 Storage가 있다고 가정 해보십시오. 간단히하기 위해, 내부의지도를 숨기고지도 키를 매개 변수로 가져옵니다.Golang의 스텁 인터페이스 포인터 파라미터

가치 복사의 필요성을 없애고 싶습니다. Java 토지에서 왔기 때문에지도가 net.Conn 포인터에 매핑되어야한다는 것이 논리적 인 것처럼 보입니다.

type Storage struct { 
    conns map[int]*net.Conn 
} 

func (s *Storage) Add(id int, conn *net.Conn){ 
    s.conns[id] = conn 
} 

... methods for initialising new storage, getting, deleting, 
maybe giving list of user id's etc. 

는 지금은 코드에 대한 자동 테스트를 작성하기를 원하지만 실제 Conns없는, 그래서 난 내 자신의 StubbConn 및 STUBB 모든 net.Conn의 -interface 방법을 쓰기.

type StubConn struct{} 

func (s *StubConn) Read(b []byte) (n int, err error) { return 0, nil } 
func (s *StubConn) Write(b []byte) (n int, err error) { return 0, nil } 
etc.. 

그리고 나는 시험이 StubbConn를 사용하려고은 ...

func TestAddOneClient(t *testing.T) { 
    clients := GetStorage() 
    conn := new(StubConn) 
    clients.Add(5, conn) 
    if len(clients.conns) != 1 { 
     t.Error("Expected client adding to increment storage map size") 
    } 
} 

은 컴파일 오류가 발생합니다

cannot use conn (type *StubConn) as type *net.Conn in argument to clients.Add: 
*net.Conn is pointer to interface, not interface 

그러나 추가 기능으로 매개 변수를 사용하는 경우 그것은 작동 conn net.Conn (값) 대신지도에 값을 보관하십시오. 그래서 Stubb 인터페이스라도 Stubb 포인터는 실제 인터페이스에 대한 포인터로 전달되지 않습니다.

인터페이스로 포인터를 매개 변수로 취하는 함수의 Conn에 대한 포인터 역할을하는 내 StubbConn 포인터를 전달하는 방법이 있습니까?

비록 내가 완전히 잃어 버렸고 포인터 대신 실제 Conn 값을 유지해야 할 가능성이 있다고해도 (포인터를 사용하는 다른 함수를 테스트하는 유닛에 대해서는 질문해야합니다) 매개 변수로 인터페이스.

답변

2

net.Conn은 인터페이스입니다. 인터페이스에 대한 포인터를 사용할 필요가 거의 없으며 인터페이스에 대한 포인터를 사용하는 함수를 찾을 수 없습니다.

지도에 net.Conn 값을 사용하십시오.

conns map[int]net.Conn 
+0

아마도 자동화 된 테스트를 위해 거의 모든 것이 다른 인터페이스에 대한 참조를 처리하는 방법을 거쳐야 할 것입니다. 인터페이스 포인터가 절대로 필요하지 않거나 나에게 좋은 읽을 거리를 제시 할 수있는 이유를 정교하게 설명 할 수 있다면이 답변을 가장 도움이 될만한 것으로 받아 들일 것입니다. – arq

+0

@arq : 인터페이스 자체는 일련의 메소드를 설명합니다. 인터페이스에 대한 포인터는 어떤 값을 가리키는 포인터 일 뿐이며 아무런 동작이나 메소드가 없습니다. ['* os.File'] (https://golang.org/pkg/os/#File)처럼 ['io.Reader'] (https://golang.org/pkg)를 수행하는 메소드가 있습니다./io/# Reader) 인터페이스를 사용하지만,'** os.File'은 메소드를 가지고 있지 않으며'* io.Reader'도 없습니다. – JimB