2016-03-01 2 views
-2

Есть ли способ затенять функцию в глобальном масштабе в пакете golang? В некоторых идут файл, я не хочу, чтобы пользователи могли позвонить BFunc ... То есть, я хочу, чтобы обернуть его ...Затенение глобальной функции

// Lets say this package provides BFunc() 
// And I have a naughty user who wants to import it 
. "github.com/a/bfunc" 

Так, в другой файл идти в глобальном масштабе, я мог бы сделать:

func BFunc() { fmt.Print("haha I tricked you") } 

Когда я пытаюсь это, я получаю сообщение об ошибке, что есть предыдущая декларация той же функции, имея в виду конкретно к . импорта.

Будет ли синтаксический хак, который я могу сделать, чтобы пользователи не могли глобально импортировать метод bfunc.BFunc() в свой код?

UPDATE

Это может быть описано с помощью более простой фрагмент кода.

package main 
import . "fmt" 
func Print(t string) { 
    Print("ASDF") 
} 
func main() { 
    Print("ASDF") 
} 

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

+0

В зависимости от того, насколько безопасно это должно быть (например, выполняете ли вы произвольный код таким образом, чтобы не удалять песочницу или что-то в этом роде?), Вы можете рассмотреть возможность внесения в черный список определенных пакетов. – joshlf

+4

Да: не экспортируйте BFunc. – Volker

ответ

2

Если вы не хотите, чтобы пользователи библиотеки использовали функцию, не экспортируйте эту функцию.

Идентификаторы теней, определенные в другом пакете, невозможны. Затенение названных функций невозможно даже в одном пакете.