GOPATH、GOROOT(VSCode编写第一个go程序)
作者:mmseoamin日期:2023-12-13

1. GOROOT和GOPATH

GOROOT 和 GOPATH 都是 Go 语言中的环境变量,用于指定 Go 工具链和工作区的路径。

GOROOT 指定了 Go 工具链的安装路径,它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时,它们会默认从 GOROOT 中查找相关的文件。一般情况下,我们不需要修改 GOROOT 的值,除非你需要使用不同版本的 Go 工具链。

GOPATH 指定了 Go 语言工作区的路径,它包含了你的项目源代码、依赖库以及编译后的可执行文件等。在使用 Go 工具链时,它们会默认从 GOPATH 中查找相关的文件。如果你的项目依赖了第三方库,那么这些库也会被下载到 GOPATH 目录下。在使用 Go Modules 进行依赖管理时,GOPATH 的作用会被降低,因为 Go Modules 可以将依赖库放在任何地方,不需要将其放在 GOPATH 目录下。

总之,GOROOT 和 GOPATH 都是 Go 语言中非常重要的环境变量,它们对于正确配置 Go 工具链和工作区非常重要。

2. GOPATH

GOPATH 是一个环境变量,用于指定 Go 语言工作区的路径。在 GOPATH 中包含了三个重要的目录:src、bin 和 pkg。其中,src 目录是用于存放 Go 语言源代码的目录,bin 目录是用于存放编译后的可执行文件的目录,pkg 目录是用于存放编译后的库文件的目录。

GOPATH 的作用是告诉 Go 工具链在哪里查找你的项目源代码和依赖库。如果你的项目不在 GOPATH 目录下,那么你需要将你的项目复制到 GOPATH/src 目录下,或者设置 GO111MODULE=on,使用 Go Modules 进行依赖管理。如果你使用 Go Modules 进行依赖管理,那么你可以将你的项目放在任何地方,不需要将其复制到 GOPATH/src 目录下。

3. vscode安装go插件后,编写代码弹出来的安装模块选择全部安装即可

  • 全部安装成功

    GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第1张

  • 安装成功后会在我们的GOPATH路径下下载到相关的可执行文件和库文件

    GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第2张

    4. vscode中显示package引用包“报错”

    GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第3张

    gopls requires a module at the root of your workspace.
    You can work with multiple modules by upgrading to Go 1.18 or later, and using
    go workspaces (go.work files).
    See the documentation for more information on setting up your workspace:
    https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
    
    • 这个“报错”并不是“‘报错”,不会影响程序的正常运行

      主要是因为我的GOPATH和工作目录不再同一目录下,有很多网友说的可以打开文件—> 首选项—> 设置—> 扩展—> go—> Alternate Tools—> 编辑settings.json ,这里添加

      "gopls": {
          "experimentalWorkspaceModule": true
      },
      
      • 我这里是行不通的,照样报错
      • 不行,不行,不行

        5. 使用 Go Modules 管理

        • 最大的好处就是我的项目可以放在任意位置

          vscode打开控制台在项目下执行go mod init <项目路径>,例如我的项目路径是D:/goproject:

        • 执行go mod init goproject

          GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第4张

        • 可以看到在我的项目底下生成了一个go.mod文件,里面放的是我的项目名称和go版本,其实这个文件还有更多作用,感兴趣的可以去多多了解,也可以达到评论区一块学习交流

        • 这个文件也可以自己手动添加不用命令

          module goproject
          go 1.17
          

          6. go.mod文件

          是的,使用 go mod init goproject 命令会在当前目录下生成一个名为 go.mod 的文件。这个文件是 Go Modules 的描述文件,它包含了你的项目名称、版本号以及依赖库等信息。

          在你的项目中使用 Go Modules 进行依赖管理时,你可以在 go.mod 文件中声明你的项目所依赖的第三方库,然后使用 go build、go test 等命令自动下载并管理这些依赖库。这样可以方便地管理你的项目依赖,并且可以避免由于依赖库版本不一致而导致的编译错误等问题。

          除了 go.mod 文件之外,使用 go mod init 命令还会生成一个名为 go.sum 的文件。这个文件用于记录你的项目所依赖的第三方库的具体版本和哈希值等信息,以确保每个人在构建你的项目时都使用相同的依赖库版本。

          7、添加依赖包到GOPATH中

          GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第5张

          could not import k8s.io/client-go/tools/clientcmd (cannot find package “k8s.io/client-go/tools/clientcmd” in GOROOT or GOPATH)

          没有在我的GOROOT或者GOPATH中找到包

          • 使用go get 命令来安装包到我的GOPATH中
            go get k8s.io/client-go
            

            这个命令会自动下载 k8s.io/client-go 包,并将其放置在 GOPATH/src 目录下。如果环境变量 $GOPATH/bin 在 $PATH 中,那么这个命令还会将可执行文件添加到 $GOPATH/bin 目录下,以便可以直接在命令行中使用这个工具。

            • 由于我的环境中k8s版本是1.19.9版本,根据官网https://github.com/kubernetes/client-go版本对应关系,选择v0.19.0

              GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第6张

              go get k8s.io/client-go@v0.19.9
              

              GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第7张

              PS D:\goproject> go get k8s.io/client-go@v0.19.9

              go: can only use path@version syntax with ‘go get’ and ‘go install’ in module-aware mode

              • 这个错误提示说明w我正在使用 Go Modules 进行依赖管理,而且我不能在模块中使用 path@version 语法来指定依赖库的版本。
                GO111MODULE=off go get k8s.io/client-go@v0.19.9
                
                • 这个命令会将 Go Modules 关闭,然后使用旧的 GOPATH 模式来下载 k8s.io/client-go@v0.19.9 包。注意,这个命令会将包下载到 $GOPATH/src 目录下,而不是在当前模块的 vendor 目录中。
                • 如果你想在模块中使用 path@version 语法来指定依赖库的版本,你需要将你的项目初始化为 Go Modules,并且在你的项目根目录下创建一个名为 go.mod 的文件。你可以执行以下命令来初始化 Go Modules:
                  go mod init goproject
                  
                  • 然后,你可以在你的代码中使用 import "k8s.io/client-go@v0.19.9"来声明依赖。注意,这个命令会将包下载到当前模块的 vendor 目录中。

                    PS D:\goproject> go mod init goproject

                    go: modules disabled by GO111MODULE=off; see ‘go help modules’

                    表明你的Go语言环境中的GO111MODULE环境变量被设置为"off",禁用了Go模块功能。

                    要解决这个问题,你可以尝试以下方法:

                    1. 确保你的Go语言版本是1.11或更新的版本,因为Go模块功能在1.11版本中才被引入。
                    2. 检查并确保你的工作目录不是在GOPATH之下,因为Go模块功能不适用于GOPATH模式。你可以使用go env命令来查看GOPATH的值,如果它指向了你的当前工作目录,则需要将工作目录移动到GOPATH之外。
                    3. 如果你在命令行中使用了set GO111MODULE=on命令,但没有生效,可能是因为你的操作系统或终端环境不同导致的。你可以尝试使用不同的命令来设置环境变量:

                      在Windows命令提示符下:setx GO111MODULE on

                      在Windows PowerShell下:$env:GO111MODULE = "on"

                      在Linux或MacOS终端下:export GO111MODULE=on

                    4. 请注意,这些命令设置的环境变量可能在当前会话中生效,但在新的终端会话中可能会失效。如果你希望持久保存环境变量的设置,你需要将它们添加到你的操作系统配置文件(例如.bashrc或.bash_profile)中。

                      GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第8张

                    • 成功执行

                      GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第9张

                    • 执行go mod tidy命令

                      你的导入语句自动更新go.mod文件并下载缺少的依赖包。确保在包含k8s.io/client-go的文件中执行该命令

                      这将自动下载缺少的依赖包并将它们添加到go.mod文件中。

                      GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第10张

                      # 查看依赖
                      go get -u
                      # 清理模块缓存
                      go clean -modcache
                      

                      8、无法导入k8s.io/client-go/tools/clientcmd

                      could not import k8s.io/client-go/tools/clientcmd (no required module provides package “k8s.io/client-go/tools/clientcmd”)

                      这个错误通常意味着缺少所需的Kubernetes客户端库。请尝试使用以下命令安装所需的依赖项:

                      go get k8s.io/client-go/tools/clientcmd@v0.19.9
                      

                      GOPATH、GOROOT(VSCode编写第一个go程序),在这里插入图片描述,第11张