2014-09-13 68 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从您的初始化函数,并goji.Serve从主

route.go

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

为主。去

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

但我还想封装在一个封装 – 2014-09-13 16:20:08

+0

嗯...奇怪,它的作品我的所有路由。在相同的内存上实例化了相同的包吗?我认为每个包的单独导入可能已经实例化了单独的包。 – 2014-09-13 16:48:53

+3

是的,一个包(和它的变量)在内存中只存在一次,无论你有多少个“导入”它。 – 2014-09-13 17:27:30

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

谢谢。你的回答给了我更多关于围棋和包装的见解。 – 2014-09-13 16:50:24

+1

包只能链接到您的程序中一次。你可以在多个文件中导入相同的包,并确保变量'packageName.Var'在任何地方都是一样的。 – AndrewN 2014-09-13 17:02:49

+1

在哪里定义路线似乎绊倒了一些搬到Go的人。如果您想从定义每个视图的相同包中设置路由,请在包的init()函数中调用route-setup函数(此处为“goji.Set”)。如果一个软件包应该定义所有的路由,它可以是'main'或者其他一些顶层软件包,用于导入所有定义视图的软件包。在Go中,你也可能会比其他语言更多地集成到一个包中。 [这是一个普通的q。如果它有帮助的话,就可以使用它(http://stackoverflow.com/questions/20380333/cyclic-dependencies-and-interfaces-in-golang)。 – twotwotwo 2014-09-13 21:27:35