无法导入自定义go模块

无法导入自定义go模块,go,module,Go,Module,这是我的主文件服务器.go: package main import ( "net/http" "routes" ) func main() { http.HandleFunc("/", routes.Handler) http.ListenAndServe(":8000", nil) } “我的路线”模块位于同一目录中: package routes func Handler

这是我的主文件服务器.go:

package main

import (
    "net/http"
    "routes"
)

func main() {
    http.HandleFunc("/", routes.Handler)
    http.ListenAndServe(":8000", nil)
}
“我的路线”模块位于同一目录中:

package routes

func Handler(w http.ResponseWriter, r *http.Request) {
    // stuff...
}
当我运行go server.go时,出现以下错误:

server.go:6:5: cannot find package "routes" in any of:
    /usr/local/Cellar/go/1.6/libexec/src/routes (from $GOROOT)
    ~/server/src/routes (from $GOPATH)
当我将代码放入routes.go文件中时,它运行正常。我无法导入模块。我已经尝试将$GOPATH变量设置为我的当前目录,我尝试重新排列我的项目目录以模拟该目录。我别无选择了。奇怪的是,一种被如此广泛采用的语言在如何用几乎所有其他语言做一些相对容易的事情方面却有如此糟糕的文档。请帮我找出我做错了什么

更新: 这是go env的输出

这篇文章是页面上的推荐起点,解释了这一点。谢谢@elithrar

Peter Bourgon在结构良好的Go应用程序方面拥有丰富的经验

您应该将routes包放在routes文件夹中,或者如果您的主包在routes文件夹中,您可以在该文件夹中放一个lib文件夹和实际routes包


文件夹结构的原因在于go import语句的工作方式。考虑到导入的工作方式,在同一文件夹中启用多个包是不明确的。

将routes包移动到/Users/me/server/src/routes,您就可以开始了。

名为routes的包必须位于~/server/src/routes目录中。在一个目录中不能有多个包。另请阅读:完整-导入路径通过golang.org->Docs在这里介绍。这样可以更容易地解释其他人的代码:对于任何给定目录,您都可以知道其中的所有Go源代码都是同一个包。Go中很少有包含数百个单文件模块的深度嵌套目录。@dopatraman Go编程语言不强制任何结构。您可以选择使用所需的任何文件结构直接运行编译器和链接器。Go工具确实施加了结构,因此除了工作区的路径外,它不需要任何配置就可以完成其工作。该文档涵盖了您所询问的场景。为什么go编译器要查找src目录?我提到的错误“~/server/src/routes`您的GOPATH可能设置为~/server。如果您粘贴准确的错误消息,我可能能够详细说明。。。听起来您的GOPATH设置为~/server,可能吧?或者。是的,但如果是这样,为什么要查找src/??另外,如果编译器在顶层查找src/dir,那么将我的模块放在routes/目录中如何解决问题?您能提供go env的输出吗?
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/server"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.6/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.6/libexec/pkg/tool/darwin_amd64"
GO15VENDOREXPERIMENT="1"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"