从子目录访问函数

我正在按照http://golang.org/doc/code.html编写小应用程序


我的目录树看起来像


-blog

  -bin

  -pkg

  -src

    -github.com

      -packages_that_i_imported

    -myblog

      -config

        routes.go

      server.go

我的server.go文件包含以下代码


package main


import "..." //ommited imports



func main(){

    r:= mux.InitRoutes()  //function from imported package

    Register_routes(r)  //function from routes.go

}

还有我的 routes.go


package main


func Register_routes(r *Router){

  r.addRoute("test", "test", "test)

}

但是在我这样做之后,我go run server.go 收到了以下错误


$ go run server.go 

# command-line-arguments

./server.go:10: undefined: Register_routes

GOPATH 变量指向我的/blog文件夹


我错过了什么?为什么 go 看不到子目录中的文件?


PS config/routes.go 是 server.go 包的一部分


PPS 我已将 routes.go 移动到与 server.go 相同的文件夹,但错误仍然存在


30秒到达战场
浏览 181回答 1
1回答

慕田峪9158850

为了使用另一个包中定义的函数,首先你必须导入它:import "myblog/config"之后你必须通过包名来引用它:config.Register_routes(r)此外,包名称应反映定义它的文件夹名称。在您的 routes.go 中,包应该是config. 包main是特殊的,main包会被编译成可执行的二进制文件(它是程序的入口点)。请参阅语言规范中的程序执行。从您链接的页面:包名称:Go 的约定是包名是导入路径的最后一个元素:导入的包"crypto/rot13"应该是 named rot13。可执行命令必须始终使用 package main。没有要求包名在链接到单个二进制文件的所有包中是唯一的,只要求导入路径(它们的完整文件名)是唯一的。查看博客文章包名称以获取详细指南。请注意,同一包的不同文件必须放在同一文件夹中。并且同一包的不同文件可以使用包中的所有内容,而无需导入它,也无需使用包名称(与定义在哪个文件中无关)。对于未导出的标识符也是如此。从另一个包中,您只能访问导出的标识符(它们的名称必须以大写字母开头)。此外,go 命名约定是使用混合大写字母而不是下划线来编写多词名称,请参阅Effective Go / MixedCaps。所以函数应该被命名,RegisterRoutes但这不是必需的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go