Golang中如何更好地理解包/模块和文件系统?

Golang中如何更好地理解包/模块和文件系统? 我很难理解 Go 的包/模块和文件系统结构。

GOROOT=“C:\Program Files\Go” GOPATH=“C:\Users\name\Documents/go/workspace”

我之所以感到困惑,还因为我不知道应该在哪里进行我的工作,以及为什么我无法导入 gorilla/mux。另外,我不太确定这一点,但 gorilla/mux 是否应该出现在我的 src 文件夹中?我尝试获取它,但它没有出现在那里,而且我知道我处于正确的工作区,因为我删除了所有文件夹并重新安装了所有内容。

could not import github.com/gorilla/mux (cannot find package "github.com/gorilla/mux" in any of 
	C:\Program Files\Go\src\github.com\gorilla\mux (from $GOROOT)
	C\src\github.com\gorilla\mux (from $GOPATH)

setup

理想情况下,我正在尝试构建一个具有 Go 后端的网站。我不确定我的设置是否正确,但我正在边学边做。

非常感谢您的帮助! 谢谢!


更多关于Golang中如何更好地理解包/模块和文件系统?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我认为在当前的Go语言环境中,如果你刚开始学习Go,最好使用Go Modules而不是GOPATH。

Go Modules 有几个好处:

  • 你可以将代码库存储在独立于GOPATH工作区的位置。
  • 更容易上手。
  • GOPATH 将在未来的Go版本中被弃用。如今,Go Modules 是事实上的标准方法。

那么,这里有一个使用Go Modules创建项目的快速示例:

  1. 为项目创建一个新目录。你可以在挂载的任何位置创建它。
  2. 在终端中通过 go mod init 命令初始化 go.mod 文件。
  3. 创建新的包、main.go 文件等。
  4. 在你的文件中导入 github.com/gorilla/mux
  5. 在终端中运行 go mod tidy 以添加模块要求和校验和。
  6. 运行你的应用程序,例如 go run main.go

更多关于Golang中如何更好地理解包/模块和文件系统?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go 1.11+中,模块系统已经取代了传统的GOPATH工作区模式。你的错误信息显示系统仍在GOPATH模式下查找包。以下是解决方案:

1. 初始化Go模块

在你的项目根目录运行:

go mod init your-project-name

这会创建go.mod文件,启用模块模式。

2. 导入gorilla/mux

在你的Go文件中正常导入:

package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.ListenAndServe(":8080", r)
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

3. 自动下载依赖

运行以下命令会自动下载所有依赖:

go mod tidy

或者直接运行你的程序:

go run main.go

4. 项目结构示例

your-project/
├── go.mod          # 模块定义文件
├── go.sum          # 依赖校验文件
├── main.go         # 主文件
└── internal/       # 内部包(可选)
    └── handlers/   # 处理程序包

5. 环境变量设置

对于现代Go开发,你只需要:

  • 设置GOROOT(通常自动设置)
  • 不需要设置GOPATH用于模块项目

6. 完整示例

创建main.go

package main

import (
    "fmt"
    "log"
    "net/http"
    
    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    
    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Welcome to Go website!")
    })
    
    router.HandleFunc("/api/users", getUsers).Methods("GET")
    
    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", router))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte(`{"users": ["Alice", "Bob", "Charlie"]}`))
}

运行:

go mod init website
go run main.go

模块系统会自动在$GOPATH/pkg/mod缓存依赖,不需要手动放在src目录下。

回到顶部