Как импортировать пакет по пути из строки в Go? - PullRequest
4 голосов
/ 10 ноября 2011

У меня есть строка с именем пакета (например, «мой / пакет / тест»), и я хочу импортировать ее и вызвать функцию из пакета.

Примерно так:

func init() {
  var pkg string = "test/my/pkg"
  import pkg
  pkg.Test()
}

PS. Спасибо за помощь

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Язык Go не позволяет использовать то, что вы упомянули в своем примере. Это осознанный выбор. По моему мнению, причина этого выбора связана с производительностью компилятора и легкостью понимания кода на машине. Это, например, включает такие инструменты, как gofix , которые могут частично исправить код Go без необходимости вмешательства пользователя.

Это также позволяет программисту четко видеть все статически импортированные пакеты, используемые программой.

См. Также правила грамматики для организации исходного файла в спецификации языка Go.


В отношении динамической загрузки пакетов во время выполнения: Go не поддерживает загрузку пакетов во время выполнения. Эта функция может быть реализована в будущем во время выполнения Go (например, она иногда запрашивается в сообщениях в списке рассылки golang-nuts), но текущее состояние таково, что эта функция не поддерживается.

2 голосов
/ 10 ноября 2011

Это невозможно в Go.Компоновщик должен знать зависимости во время компиляции, однако ваша строка (и функция init) оцениваются во время выполнения.Также обратите внимание, что части ваших программ, которые не используются, то есть все, что не указано явно, даже не будут частью окончательного двоичного файла - поэтому отражение также невозможно.

Если вам нужно что-то подобноеВы должны управлять отображением самостоятельно.Например, вы можете использовать глобальную карту в одном пакете и использовать функции init в других пакетах, чтобы зарегистрировать соответствующие функции, добавив их на карту.После этого вы можете использовать карту для динамического поиска.

Например, посмотрите на пакет http.В вымышленном блог-пакете вы можете использовать функцию blog.init (), чтобы зарегистрировать пару обработчиков http с помощью функции http.HandleFunc (pattern, handler).Главный пакет может затем вызвать http.ListenAndServe (), который ищет нужные обработчики во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...