Ответ 1
В дополнение к ответам, которые вы уже получили, рассмотрите возможность использования значений метода получателя-карри и http. HandlerFunc.
Если ваши данные - это данные, которые загружаются до начала процесса, вы можете пойти примерно так:
type Common struct {
Data map[string]*Data
}
func NewCommon() (*Common, error) {
// load data
return c, err
}
func (c *Common) Root(w http.ResponseWriter, r *http.Request) {
// handler
}
func (c *Common) Page(w http.ResponseWriter, r *http.Request) {
// handler
}
func main() {
common, err := NewCommon()
if err != nil { ... }
http.HandleFunc("/", common.Root)
http.HandleFunc("/page", common.Page)
http.ListenAndServe(...)
}
Это работает хорошо, если все данные Common
доступны только для чтения. Если данные Common
считываются/записываются, тогда вам нужно иметь что-то большее:
type Common struct {
lock sync.RWMutex
data map[string]Data // Data should probably not have any reference fields
}
func (c *Common) Get(key string) (*Data, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
d, ok := c.data[key]
return &d, ok
}
func (c *Common) Set(key string, d *Data) {
c.lock.Lock()
defer c.lock.Unlock()
c.data[key] = *d
}
Остальное в основном то же самое, за исключением того, что вместо прямого доступа к данным через поля получателя вы получите доступ к ним через получатели и сеттеры. На веб-сервере, где читается большая часть данных, вам, вероятно, понадобится RWMutex, так что чтение может выполняться одновременно друг с другом. Другим преимуществом второго подхода является то, что вы инкапсулировали данные, поэтому в будущем вы можете добавлять прозрачные записи и/или читать из memcache или группового кэша или что-то в этом роде, если ваше приложение будет испытывать такую потребность.
Одна вещь, которая мне очень нравится в определении моих обработчиков как методов на объекте, состоит в том, что она значительно облегчает их unit test: вы можете легко определить тест с таблицей, который включает в себя значения, которые вы хотите, и ожидаемый результат без необходимости гашения с глобальными переменными.