2014-11-17 2 views
-1

Предположим, что есть функция F в пакете A, чтобы код, который я создаю, нужно вызвать. Как мне это назвать?Ссылка на символ в пакете Go, не зная, находитесь ли вы в этом пакете?

Если я звоню из внешнего пакета A, то я использую A.F(...), и если я внутри A Я использую F(...). Но что, если Мерфи мешает мне узнать, что верно, или требует байт-идентичной работы в обоих?

[примечание: я принимаю это как данность, что такой случай произойдет, потому что, по моему опыту и наблюдениям, это, как правило, безопасное предположение. Даже в отсутствие технических причин для этого, PHB и законодатели являются хорошими источниками смешного.]

+0

Не можете ли вы всегда использовать 'A.F()' на языке Go? Почему бы вам не знать об этом во время компиляции? –

+0

Невозможно. Похоже, пользователи, похоже, как-то попадают. :) – twotwotwo

+0

'A.F' изнутри' A' относится к 'A.A.F', которого не существует. - Я прошу об этом в основном из любопытства, если Go включает в себя побег-люк для этого или если он предположит, что мир всегда будет соответствовать его ожиданиям. – BCS

ответ

3

Синтаксиса такого синтаксиса нет. Соблюдайте следующие вещи:

  • Циклический импорт запрещен. Это особенно означает, что пакет не может импортировать себя. Таким образом, пакет не может ссылаться на один из его символов S с синтаксисом pkg.S, поскольку он не сможет импортировать себя.
  • Даже если вы решили эту проблему, обратите внимание, что после импорта им может быть присвоено произвольное имя. Например, вы могли бы сделать:

    import bar "foo" 
    

    который импортирует S из пакета "foo" в bar.S в отличие от ожидаемого foo.S.

Следующие вещи могут быть использованы, чтобы обойти это:

  • В пакете "foo", создать внутренний объект foo, членами которого являются символы foo экспорта. Это позволяет использовать синтаксис foo.S в самом foo, но это ужасный kludge.
  • Используйте импортную декларацию как

    import . "foo" 
    

    , который позволяет использовать символ S из пакета "foo" в S, я и thinsp;. Е. без префикса. Обратите внимание, что этот вид декларации импорта, называемый dot import, считается плохим стилем и может сломать вещи, если набор символов, которые вы объявляете/импортируемый пакет, объявляет изменения.

+0

Yuck. Почему он не имеет привязки FQN (например, префикс '::' в C++) – BCS

+0

@BCS Почему это должно быть? Это необходимо только в C++, потому что C++ допускает произвольные вещи с именами. В Go имя-пространство внутри файла никогда не изменяется, поэтому почему должен быть такой синтаксис? Также нет препроцессора, поэтому еще меньше причин. – fuz

+0

В редких случаях, когда мне нужно только беспокоиться о технических ограничениях, вы, вероятно, правы. Но в общем случае ... – BCS