패키지의 이름 (예 : "my/package/test")이있는 문자열이 있는데이를 가져 와서 패키지의 일부 함수를 호출하고 싶습니다. 이 같은이동 경로의 문자열에서 패키지를 가져 오는 방법은 무엇입니까?
뭔가 :
func init() {
var pkg string = "test/my/pkg"
import pkg
pkg.Test()
}
PS. 도움을 주셔서 감사합니다
패키지의 이름 (예 : "my/package/test")이있는 문자열이 있는데이를 가져 와서 패키지의 일부 함수를 호출하고 싶습니다. 이 같은이동 경로의 문자열에서 패키지를 가져 오는 방법은 무엇입니까?
뭔가 :
func init() {
var pkg string = "test/my/pkg"
import pkg
pkg.Test()
}
PS. 도움을 주셔서 감사합니다
Go 언어는 사용자가 언급 한 내용을 허용하지 않습니다. 이것은 의식적인 선택입니다. 제 생각에는이 선택의 이유는 컴파일러의 성능과 코드 이해의 용이성입니다. 예를 들어 사용자가 개입 할 필요없이 부분적으로 Go 코드를 수정할 수있는 gofix과 같은 도구를 사용할 수 있습니다.
또한 프로그래머는 프로그램에서 사용하는 정적으로 가져온 패키지를 모두 명확하게 볼 수 있습니다.
Go 언어 사양의 source file organization에 대한 문법 규칙을 참조하십시오.
런타임에 패키지를 동적으로로드하는 것과 관련하여 : Go는 런타임에 패키지를로드 할 수 없습니다. 미래 Go 실행 시간은이 기능을 구현할 수 있습니다 (예 : golang-nuts 메일 목록의 메시지에서 가끔 요청되는 경우). 그러나 현재 상태는이 기능에 대한 지원이 없다는 것입니다.
Go에서는 불가능합니다. 링커는 컴파일시 종속성을 알아야하지만, 문자열 (및 init 함수)은 런타임에 평가됩니다. 또한 사용되지 않는 프로그램, 즉 명시 적으로 참조되지 않은 모든 부분은 최종 2 진수의 일부가 아니기 때문에 반영 할 수 없습니다.
이와 같은 것이 필요한 경우 사용자가 직접 매핑을 관리해야합니다. 예를 들어 하나의 패키지에서 글로벌 맵을 사용하고 다른 패키지의 init 함수를 사용하여 관련 함수를 맵에 추가하여 등록 할 수 있습니다. 그런 다음지도를 사용하여 조회를 동적으로 수행 할 수 있습니다.
예를 들어 http 패키지를 살펴보십시오. 가상의 블로그 패키지에서 blog.init() 함수를 사용하여 http.HandleFunc (패턴, 핸들러) 함수를 사용하여 두 개의 HTTP 핸들러를 등록 할 수 있습니다. 그런 다음 주 패키지는 http.ListenAndServe()를 호출하여 런타임에 오른쪽 핸들러를 찾습니다.
오케이. 나는 다른 질문이있다. 이름으로 패키지에서 함수를 호출하는 법 (PHP의 call_user_func와 같은)? – Rusfearuth
@Rusfearuth는'reflect' 패키지를 살펴 봅니다. –