2015-06-11 4 views
1

Учитывая пакет, содержащий следующую локальную переменную и функции:Передача переменных в Golang Пакет

var bucket *gocb.Bucket 

func Init(b *gocb.Bucket) { 
    bucket = b 
} 

func DoSomething() { 
    // do something with 'bucket' 
} 

Приемлемо для вызова функции Init, передавая экземпляр bucket, перед вызовом DoSomething, который зависит на переменной bucket?

Или, если DoSomething вместо явно принимает параметр bucket следующим образом:

func DoSomething(bucket *gocb.Bucket) { 
    // do something with 'bucket' 
} 

Я бы предпочел, чтобы создать экземпляр одного экземпляра bucket на уровне пакета, и использовать его на протяжении всего приложения жизненного цикла , в отличие от управления на уровне функции. Является ли это приемлемым с точки зрения дизайна, производительности и т. Д., Перспективы или есть ли предпочтительное средство достижения этого? Принимая во внимание, что bucket нужно создавать только один раз.

DoSomething будет вызываться из контекста HTTP; Я бы предпочел, чтобы обработчики HTTP не имели видимости в параметре bucket, а вместо этого создавали экземпляр bucket при запуске приложения.

ответ

4

In Go, если ваш пакет зависит на что-то внешнее вы импорт упомянутый предмет. Поэтому, если по какой-либо причине это невозможно, вы должны импортировать пакет, который создает bucket, и взять его оттуда, либо напрямую назначив его, либо в функции вашего init вашего пакета.

import "my/other/pkg" 

var bucket = pkg.InitBucket() 

Однако, если это невозможно определить положение будет то, что пакет bucket, то ваш путь путь. В качестве примера рассмотрим database/sql, где SQL-драйверы должны быть зарегистрированы до их использования.

В общем, IoC не относится к пакетам Go, если это то, что вы имели в виду.

Смежные вопросы