Go后端开发 -- 环境搭建

发布时间:2023年12月20日

Go后端开发 – 环境搭建


一、环境配置

Go官网下载地址:https://golang.org/dl/
https://go.dev/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/

以Linux版本为例:

  • 下载后,上传到Linux服务器中,解压到/usr/local路径中:
    sudo tar -zxvf go1.21.5.linux-amd64.tar.gz -C /usr/local/
    进入/usr/local路径,有一个go文件夹:
    在这里插入图片描述
    进入该文件夹
    在这里插入图片描述
    其中src目录下是go的源码
    在这里插入图片描述
    进入bin目录
    在这里插入图片描述
    有两个指令,go是go语言的编译环境,我们需要将当前路径配置到系统环境变量中;

  • 配置环境变量:
    回到家目录下,打开默认配置文件:
    在这里插入图片描述
    加入以下环境变量:
    export GOROOT="/usr/local/go" export GOPATH=$HOME/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN
    在这里插入图片描述
    GOROOT:go语言的源码包所在的路径;
    GOPATH:go语言的工作路径,可以自定义;
    GOBIN:go语言源码编译环境路径;
    PATH:配置系统环境变量;

    配置完后,保存并加载一下:
    在这里插入图片描述
    检查版本,验证环境配置是否成功:
    在这里插入图片描述
    go --help指令能够查看当前有哪些指令可以使用:
    在这里插入图片描述

  • 配置GOPATH:
    gopath就是go项目代码存放的位置,可以自定义,该目录下有三个子目录:src,pkg, bin;

    • src:里面的每一个子目录,就是一个包,包内是go的源码文件
    • pkg:编译后生成的,包的目标文件
    • bin:生成的可执行文件
      在这里插入图片描述
  • GOPROXY
    Go1.14版本之后,都推荐使用go mod模式来管理依赖了,也不再强制我们把代码必须写在GOPATH下面的src目录了,你可以在你电脑的任意位置编写go代码。
    默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct,
    由于国内访问不到 https://proxy.golang.org 所以我们需要换一个PROXY,这里推荐使用https://goproxy.iohttps://goproxy.cn
    可以执行下面的命令修改GOPROXY:

go env -w GOPROXY=https://goproxy.cn,direct

Go 1.11 版本推出modules机制,简称 mod,更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。
从 Go 1.11 开始,Go 允许在$GOPATH/src的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 Go 1.13 开始,go.mod模式将成为默认模式。
Go Modules 在 Go 1.11 及 Go 1.12 中有三个模式,根据环境变量 GO111MODULE 定义:

  • 默认模式(未设置该环境变量或 GO111MODULE=auto

    1. 当前目录不在 GOPATH/src/ 下;
    2. 在当前目录或上层目录中存在 go.mod 文件;
  • GOPATH 模式(GO111MODULE=off
    Go 命令行工具从不使用 Go Modules。相反,它查找 vendor 目录和 GOPATH 以查找依赖项。

  • Go Modules 模式( GO111MODULE=on
    Go 命令行工具只使用 Go Modules,GOPATH不再作为导入目录,但它还是会把下载的依赖储存在 GOPATH/pkg/mod 中,也会把 goinstall的结果放在 GOPATH/bin 中,只移除了 GOPATH/src/
    如果 GO111MODULE 没有显式设置,那么默认为 on。如果 go env 查出来的环境变量 GO111MODULE 为空,那么 go 编译器默认 GO111module 为 on。

Go modules 的使用:

# 临时开启 Go modules 功能
export GO111MODULE=on
# 永久开启 Go modules 功能
go env -w GO111MODULE=on

# 设置 Go 的国内代理,方便下载第三方包
go env -w GOPROXY=https://goproxy.cn,direct

如果设置失败,可以直接修改~/.bashrc配置文件:
在这里插入图片描述
逗号后面可以增加多个 proxy,最后的 direct 则是在所有 proxy 都找不到的时候,直接访问,代理访问不到的私有仓库就可以正常使用了。
其它代理请参考:
https://www.cnblogs.com/feiquan/p/13357971.html
https://studygolang.com/articles/23599?fr=sidebar
最后通过env查看:
在这里插入图片描述

二、IDE的选择

目前go开发的主流IDE有GoLand和VS Code,下面以VS Code为例,实现go的开发环境配置;

  • 使用VS Code插件remote SSH远程连接Linux云服务器:
    在这里插入图片描述
  • 安装插件:
    在这里插入图片描述
  • 配置GOPROXY和Go Module:
    Go1.14版本之后均使用go mod来管理依赖环境
sudo go env -w GOPROXY=https://goproxy.cn,direct
sudo go env -w GO111MODULE=on

三、使用go mod构建项目

1.初始化项目

我们使用了go mod模块,就可以在$GOPATH以外的目录创建项目,然后初始化 go mod init project_name,成功之后会发现目录下会生成一个 go.mod 文件。
在这里插入图片描述
在这里插入图片描述
查看内容
在这里插入图片描述
go.mod 文件只存在于模块的根目录中模块子目录的代码包的导入路径等于模块根目录的导入路径(就是前面说的 module path)加上子目录的相对路径。
?
比如,我们如果创建了一个子目录叫 common,我们不需要(也不会想要)在子目录里面再运行一次 go mod init 了,这个代码包会被认为就是 go_test 模块的一部分,而这个代码包的导入路径就是 go_test/common

2.添加依赖项

在 go_test 文件夹下创建main.go并添加以下内容

package main

import (
  "net/http"

  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "pong",
    })
  })
  r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

执行 go build main.go 之后会自动下载三方包到默认的目录 $GOPATH/pkg/mod,也就是 Mod Cache 路径;
在这里插入图片描述
进入$GOPATH/pkg/mod目录查看
在这里插入图片描述
查看go.mod文件和go.sum文件:
在这里插入图片描述

  • module 表示模块名称
  • require 依赖包列表以及版本
    一般来说,require () 是不需要自己手动去修改的,当运行代码的时候,会根据代码中用到的包自动去下载导入
  • exclude 禁止依赖包列表,不下载和引用哪些包(仅在当前模块为主模块时生效)
  • replace 替换依赖包列表和引用路径(仅在当前模块为主模块时生效)
    replace 对于国内开发来说是个神功能,他可以将代码中使用,但国内被墙的代码替换成 github上的下载路径,例如:golang.org/x/ 下的包,全都替换成 github地址上的包,版本使用 latest 即可。
    replace 指令可以将依赖的模块替换为另一个模块,例如由公共库替换为内部私有仓库。
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5

replace (
	golang.org/x/net => github.com/golang/net latest
	golang.org/x/tools => github.com/golang/tools latest
	golang.org/x/crypto => github.com/golang/crypto latest
	golang.org/x/sys => github.com/golang/sys latest
	golang.org/x/text => github.com/golang/text latest
	golang.org/x/sync => github.com/golang/sync latest
)

indirect 表示这个库是间接引用进来的。
使用 go list -m all 可以查看到所有依赖列表,也可以使用 go list -json -m all 输出 json格式的打印结果。

除了 go.mod 之外,go 命令行工具还维护了一个 go.sum 文件,它包含了指定的模块的版本内容的哈希值作为校验参考:
在这里插入图片描述
go 命令行工具使用 go.sum 文件来确保你的项目依赖的模块不会发生变化——无论是恶意的,还是意外的,或者是其它的什么原因。go.mod 文件和 go.sum 文件都应该保存到你的代码版本控制系统里面去。

go.sum 这个文件记录了源码的直接依赖和间接依赖包的相关版本的 hash 值,用来校验本地包的真实性。在构建的时候,如果本地依赖包的 hash 值与 go.sum 文件中记录的不一致,就会被拒绝构建,这样可以确保你的项目所依赖的 module 内容,不会被恶意或意外篡改。

3.运行项目

  • 编译代码:
    go build main.go
    在这里插入图片描述
  • 运行代码:
    go run main.go
    在这里插入图片描述

四、环境报错

1.VS Code中gopls报错

显示gopls was not able to find modules in your workspace,这种报错的原因是,使用VS Code打开的远程目录当做workspace,但是由于go mod机制,源码不在$GOPATH中,需要使用go mod init来初始化项目,而初始化形成的go.mod文件不在workspace目录下,而在其子目录下,导致gopls寻找modules错误;
在这里插入图片描述
解决方案是使用go work机制,即多模块工作区机制(要把哪些mod纳入到你的工作区内);
vscode打开的文件夹的路径默认作为了其工作区(workspace),而这个工作区的根目录要有go.mod文件,如果根目录没有这个go.mod就要指定哪些子目录的go mod纳入工作区
go work init
go work use 需要纳入工作区的子目录
在这里插入图片描述
在这里插入图片描述
这样gopls就不会报错了;
也可以选择VS Code直接打开项目目录作为workspace,但这样比较不方便;

文章来源:https://blog.csdn.net/kissland96166/article/details/135088010
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。