2014-09-01 5 views
0

이동 (Go)에서는 fmt.Printf("%T",Struct{})으로 구조 유형을 인쇄 할 수 있지만 새로운 구조가 작성되어 메모리를 차지합니다. 그래서 나는 단지 fmt.Printf("main.Struct")을 인쇄 할 수도 있지만 누군가 refactors에 Struct의 이름을 가정하면 print 문이 업데이트되지 않고 코드가 손상됩니다.인스턴스를 만들지 않고 구조체를 인쇄하십시오.

인스턴스를 만들지 않고 유형의 구조체를 인쇄하려면 어떻게해야합니까?

fmt.Printf("%v", reflect.TypeOf((*Struct)(nil)).Elem()) 

구조의 인스턴스를 생성하지 않습니다 솔루션의

+1

실제로 달성하려는 것은 무엇입니까? 인스턴스를 만들지 않고 유형을 인쇄하면 무엇을 할 수 있습니까? – elithrar

+0

오류보고'errors.New (fmt.Sprintf ("% T 유형의 예상 구조이지만 % T 유형의 구조를 제공했습니다", 구조체 {}, 객체))'이므로 스크립트는 중단되지 않지만 제공된 정보가 오도 된 것입니다. 어떤 경우에는 리팩토링이 스크립트를 깨뜨릴 수있는 것처럼 일반적인 질문을 계속했습니다. – david

답변

2

항상을 사용하면 유형, 기간의 이름을 가져올 수 있습니다.

는 내부적으로 fmt.Printf("%T", x)reflect.TypeOf(x) (출처 : http://golang.org/src/pkg/fmt/print.go#L721)를 사용

사용이 fmt.Sprintf를 사용할 수 있지만, 그것은 여전히 ​​반사 + 형식 문자열을 구문 분석의 추가 오버 헤드를 사용합니다.

name := fmt.Sprintf("%T", (*S)(nil))[1:] //lose the * 
// or 
name := reflect.TypeOf((*S)(nil)).String()[1:] 
+0

'Elem()'을 쓰지 않는 이유는 무엇입니까? – nemo

+0

@nemo'Elem()'은'reflect' 패키지에서만 사용할 수 있습니다. 그러나'% T'는 내부적으로 '반영'패키지를 사용하기 때문에 직접 사용하지 않아도됩니다. – david

+0

출력을 이미 알고 있으므로 사용하는 이유는 무엇입니까? – OneOfOne

1

하나는 패키지 reflect을 사용하는 것입니다. main.Struct이 인쇄됩니다.

+0

리플렉션을 사용하지 않는 간단한 해결책이 있습니다. 대신 리플렉션을 사용합니다. – david

+0

당신이 모르는 타입을 다루고 있기 때문에 당신은 반성하지 않을 것입니다. 당신은 유형 스위치로 그것들을 검사 할 수 있지만 끝 반사에서는 갈 길입니다. – nemo

관련 문제