2014-02-28 2 views

답변

13

네, 가능합니다.

greet: make(chan pet) 

을 그리고 당신은 완벽하게 type pet interface를 구현 아무것도를 보낼 수있을 것입니다 : 코드에서 예를 들어, 당신은 바로 사용할 수 있습니다.

완전히 제네릭 당신은 당신이 뭔가를받을 때 그것이 무엇인지 알아 reflect를 사용하여 다음 chan interface{}을 사용할 수 있습니다 뭔가를 보내려면.


바보 - 관용적하지 아마와 - 예 : BurntSushi5가 지적 하듯이

ch := make(chan interface{}) 

go func() { 
    select { 
    case p := <-ch: 
     fmt.Printf("Received a %q", reflect.TypeOf(p).Name()) 
    } 
}() 
ch <- "this is it" 

, 유형 스위치는 더 나은 :

p := <-ch 
switch p := p.(type) { 
case string: 
    fmt.Printf("Got a string %q", p) 
default: 
    fmt.Printf("Type of p is %T. Value %v", p, p) 
} 
+4

일반적으로 리플렉션에 의존하기 전에 유형 스위치를 사용하려고합니다. 형식 이름을 얻으려면 값과 함께 서식 옵션 % T을 (를) 사용할 수 있습니다. '반영하다 '는 필요 없다. – BurntSushi5

+0

@ BurntSushi5 귀하의 의견에 감사드립니다! – cnicutar

0

귀하의 예를 몇 가지 문제가있다 그러나 질문에 초점을 맞추자.

하나의 "일반"채널을 통해 여러 유형을 전송할 수 있습니까?

...

귀하의 예는 식 스위치 누수.

p := <-greet 
switch pat := p.(type) { 
case *dog: 
    pat.say_hello() 
case *cat: 
    pat.say_hello() 
} 

BTW이 당신이 그것을 차례에서 모든 유형 및 switch를 저장하기 위해 많은 메모리를 할당하기 때문에 좋은 디자인 아니다 비용이 많이 드는 작업이다 example은 (단지 주요 문제를 강조하기 위해)이 단순화된다. 유형을 명시 적으로 유지하십시오. 다른 작업을 수행하는 여러 인터페이스를 사용하는 것이 더 좋습니다. interface{}

+1

어떤 유형을 저장하기 위해 많은 메모리를 할당해야합니까? 그 의견에 대해 자세히 설명해 주시겠습니까? – nitimalh