2014-09-13 4 views
-3

Моя цель - инкапсулировать в один модуль/пакет.Как сохранить «пакет» в Go?

Основной пакет:

package main 

import (
    "github.com/zenazn/goji" 
    "./routes" 
) 

func main(){ 
    routes.Setup() 
    goji.Serve() 
} 

И еще один пакет:

package routes 

import "github.com/zenazn/goji" 

func Setup() { 
    goji.Get("/static", func(w http.ResponseWriter, r *http.Request) { 
     fmt.Fprint(w, "static!") 
    }) 
} 

Как я могу это сделать?

ответ

3

goji, в вашем примере, представляет собой пакет. Не переменная.

Вы не можете передавать пакеты таким образом.
Если вы посмотрите на пример на goji github page

Вы просто просто позвонить goji.Get из вашей функции Init и goji.Serve от вашей основной

route.go

package route 
import "route" 
import "github.com/zenazn/goji" 
func Init(){ 
    goji.Get("/hello/:name", hello) 
} 

магистралью. go

package main 
import "github.com/zenazn/goji" 
func main(){ 
    route.Init() 
    goji.Serve() 
} 
+0

но ид нравится инкапсулировать все мои маршруты в одном пакете –

+0

хмм ... странно, что он работает. это те же пакеты, созданные в одной памяти? Я думал, что отдельный импорт на один пакет может создать отдельные экземпляры. –

+3

Да, пакет (и его переменные) существует только один раз в памяти, независимо от того, сколько мест вы «импортируете» его. –

3

Пакеты в экспортных константах, переменных, типах и функциях, которые имеют заглавные буквы в качестве их имени. Сам пакет не является чем-то непосредственным образом манипулируемым программой.

Пакет goji должен экспортировать переменную, названную как goji.Goji, если вы хотите получить к ней прямой доступ из других пакетов. Лучшим решением является предоставление некоторых функций в пакете, которые позволяют вам регистрировать свои функции/помощники.

Можно также экспортировать функцию из goji как:

func Set(s string, func(w http.ResponseWriter, r *http.Request)) { ... } 

, которые могут быть использованы другими пакетами:

goji.Set("/static", myFunc) 

Ошибка у вас «использование пакета годжи без выбора» говорит вы не можете использовать имя пакета без указания того, какое экспортированное значение вы хотите получить из пакета. Ожидается, что goji.something не будет goji сам по себе.

Функции init() внутри идет файлы имеют специальные свойства: см http://golang.org/ref/spec#Program_initialization_and_execution

+0

спасибо. ваш ответ дал мне больше информации о Go и пакетах. –

+1

Пакеты привязаны к вашей программе ровно один раз. Вы можете импортировать один и тот же пакет в несколько файлов и быть уверенным, что переменная 'packageName.Var' одинакова везде. – AndrewN

+1

Где определить маршруты, кажется, сработало несколько человек, которые переехали в Go. Если вы хотите настроить маршруты из того же пакета, где вы определяете каждое представление, вызовите функцию настройки маршрута ('goji.Set' здесь) в функциях' init() 'пакетов. Если один пакет должен определять все ваши маршруты, он может быть «основным» или другим пакетом toplevel, который импортирует все пакеты, которые определяют представления.Вы также можете объединить больше в один пакет в Go, чем другие языки. [Вот общий q. в папке deps] (http://stackoverflow.com/questions/20380333/cyclic-dependencies-and-interfaces-in-golang), если это помогает. – twotwotwo