青训营X豆包MarsCode 技术训练营——搭建Go环境并创建Go项目| 豆包MarsCode AI 刷题

273 阅读4分钟

前面一直都是在单个的go文件中进行编译运行,昨天学习了go module之后,发现还需要配置一些别的东西,比如goproxy等。在此记录一下完整的go项目创建过程。

前置准备:

  • 安装vscode

安装Go

下载链接:go.dev,我直接在这个网站中下载了最新的go(go1.23.2.windows-amd64.msi),是一个msi文件,下载后直接点击运行默认安装即可。

Go的环境变量

这里主要配置了两个环境变量:GOROOT和GOPATH。 下载安装完goGOROOT已经被自动加入到系统变量中。

  • 运行cmd,输入go env:

image.png 我把需要关注的几个变量用红色边框圈出,留有印象。现在只需要关注GOROOTGOPATH的路径,并把它们加入到系统变量中: image.png 然后再把它们加入到系统变量的path中:

image.png

安装vscode插件

go语言要在vscode上运行需要安装go插件和code runner插件 image.png

创建go项目

go使用go module来进行依赖管理。 首先创建一个文件夹作为项目文件夹,我这里创建了一个test项目。进入到该目录下的终端,输入go mod init test。发现生成了一个go.mod文件,这个文件就是module用来管理依赖的文件。

module test
go 1.23.2

接下来我们创建一个hello.go:

package main

import "fmt"

func main() {
    fmt.Println("hello")
}

运行成功,这里的fmt是go自带的原生库。如果我们想要使用第三方库应该怎么办呢? rsc.io/quote库提供了一个收集名言警句的包。在代码中引入:

package main

import "fmt"

import "rsc.io/quote"

func main() {
    fmt.Println(quote.Go())
}

点击运行,发现报错:

hello.go:5:8: no required module provides package rsc.io/quote; to add it:
        go get rsc.io/quote

原来我们还没有成功的引入该module,建议我们使用go get来获取。但是在这里我使用的是go mod tidy,他们的区别在于go mod tidy还能够清除不需要的依赖,避免依赖过于臃肿。

运行 go mod tidy,依然报错:

go: test imports
        rsc.io/quote: module rsc.io/quote: Get "https://proxy.golang.org/rsc.io/quote/@v/list": dial tcp 142.251.33.81:443: connectex: A connection attempt dial tcp 142.251.33.81:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

原来前面看到的GOPROXY变量的作用就在于此,它指定了第三方库的来源,由于网络原因,我们需要把它配置为国内镜像源。运行go env -w GOPROXY=https://goproxy.cn(还有一些其他的镜像源,可以自行尝试) 再次尝试go mod tidy,发现依赖已经成功安装.

>go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c

成功运行hello程序。给我输出了一个名言:Don't communicate by sharing memory, share memory by communicating.嗯~确实很有道理,当目的不纯粹,交流也变得吃力。 我们还发现go.mod已经悄悄地发生了变化:

module test

go 1.23.2

require rsc.io/quote v1.5.2

require (
	golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
	rsc.io/sampler v1.3.0 // indirect
)

在go.mod中已经自动引入了我们需要的依赖。inderect表示间接依赖。还多了一个go.sum文件,以下为go.sum的介绍:

为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建

为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。

为了以后导入包更方便,可以把GOPROXY变量也在系统变量中进行配置。

image.png 经过这次创建项目的经历,我对go的依赖管理方式有了更深的认识,发现Go Modules相比旧的GOPATHgovendor提供了更好的依赖管理和版本控制。Go Modules锁定依赖的确切版本,这有助于避免在不同环境中出现不一致的问题。