2011-11-10 2 views

답변

3

Go 언어는 사용자가 언급 한 내용을 허용하지 않습니다. 이것은 의식적인 선택입니다. 제 생각에는이 선택의 이유는 컴파일러의 성능과 코드 이해의 용이성입니다. 예를 들어 사용자가 개입 할 필요없이 부분적으로 Go 코드를 수정할 수있는 gofix과 같은 도구를 사용할 수 있습니다.

또한 프로그래머는 프로그램에서 사용하는 정적으로 가져온 패키지를 모두 명확하게 볼 수 있습니다.

Go 언어 사양의 source file organization에 대한 문법 규칙을 참조하십시오.


런타임에 패키지를 동적으로로드하는 것과 관련하여 : Go는 런타임에 패키지를로드 할 수 없습니다. 미래 Go 실행 시간은이 기능을 구현할 수 있습니다 (예 : golang-nuts 메일 목록의 메시지에서 가끔 요청되는 경우). 그러나 현재 상태는이 기능에 대한 지원이 없다는 것입니다.

+0

오케이. 나는 다른 질문이있다. 이름으로 패키지에서 함수를 호출하는 법 (PHP의 call_user_func와 같은)? – Rusfearuth

+2

@Rusfearuth는'reflect' 패키지를 살펴 봅니다. –

2

Go에서는 불가능합니다. 링커는 컴파일시 종속성을 알아야하지만, 문자열 (및 init 함수)은 런타임에 평가됩니다. 또한 사용되지 않는 프로그램, 즉 명시 적으로 참조되지 않은 모든 부분은 최종 2 진수의 일부가 아니기 때문에 반영 할 수 없습니다.

이와 같은 것이 필요한 경우 사용자가 직접 매핑을 관리해야합니다. 예를 들어 하나의 패키지에서 글로벌 맵을 사용하고 다른 패키지의 init 함수를 사용하여 관련 함수를 맵에 추가하여 등록 할 수 있습니다. 그런 다음지도를 사용하여 조회를 동적으로 수행 할 수 있습니다.

예를 들어 http 패키지를 살펴보십시오. 가상의 블로그 패키지에서 blog.init() 함수를 사용하여 http.HandleFunc (패턴, 핸들러) 함수를 사용하여 두 개의 HTTP 핸들러를 등록 할 수 있습니다. 그런 다음 주 패키지는 http.ListenAndServe()를 호출하여 런타임에 오른쪽 핸들러를 찾습니다.

관련 문제