如何坚持"包装" Go中的州?

时间:2014-09-13 15:53:10

标签: 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!")
    })
}

我该怎么做?

2 个答案:

答案 0 :(得分:3)

在你的例子中,goji是一个包。不是变量。

你不能像这样传递包裹。
如果您查看goji github page

上的示例

你只需从你的Init函数调用goji.Get,然后从你的主函数调用goji.Serve

route.go

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

main.go

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

答案 1 :(得分:3)

包含大写字母作为名称的go导出常量,变量,类型和函数中的包。程序包本身不是程序可直接操作的东西。

如果要从其他包直接访问,goji包应该导出名为goji.Goji的变量。更好的解决方案是在包中提供一些功能,允许您注册您的函数/帮助程序。

你也可以从goji导出一个函数,如:

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

可以被其他包使用:

goji.Set("/static", myFunc)

您遇到的错误"使用没有选择器的包goji"是说你不能使用包的名称而不指定你想从包中输出哪个值。它本身期待goji.something而不是goji

go文件中的函数init()具有特殊属性:请参阅http://golang.org/ref/spec#Program_initialization_and_execution