如何使用go mod的方式来编写第一个 go helloworld

前言

如果你在互联网上查找 go 语言的 helloworld 示例程序时,还看到别人的例子,让你如何配置 GOPATH 的话,基本可以说明那篇文章大概率是比较老的。

golang 1.11版本以上, 就开始支持go modules。当前使用 go modules 来管理工程的项目也越来越多。

那到底有什么好处呢?

不知你是否有过那种经历,当你想学习 go 语言,在互联网上搜索到一篇教程,按照其中的例子写了个 helloworld.go,结果使用 go build、go run 怎么弄都跑不起来,编译器告诉你找不到相应文件。

是的,的确如此,go 程序的代码工程是需要 GOPATH 环境变量,并且要按照如下的目录结构来组织:

path of $GOPATH:
├─bin
├─pkg
├─src
│  └─helloworld
│      └─helloworld.go

是不是相当麻烦(因为你在网上找到的helloworld例子,不一定会告诉你需要这么做,或者假定你已经这么做)。

当有了 go modules 之后,你的目录可以这么组织:

path of everywhere:
├─go.mod
└─helloworld.go

是的,就是这么简单。

我们为什么要使用 Go Modules?

  • 在不借助任何额外工具的情况下,依赖包只能手动下载。
  • 手动下载第三方包也没有版本的概念。
  • 需要配置 GOPATH,协同开发需要统一依赖包。
  • 如果使用的包引用了其他已经转移的包,需要自己修改。
  • 第三方包和自己开发的包都在 GOPATH 下的 src 目录,比较混乱。

使用了 Go Modules 之后

  • 依赖包自动下载。
  • 会给第三方包标上准确的版本号。
  • 项目根目录下会自动生成 go.mod 文件,列出依赖。
  • 对于转移了的包,可以使用 replace 特性进行替换。
  • 项目可以放在 GOPATH 下的 src 目录之外的地方。

以下是配置使用 Go Modules 的过程

前置检查

先确保您的 golang 版本大于等于 1.12

go version
//go version go1.12.9

非必要)环境变量GO111MODULE 可设置为三种值:

  • auto自动模式,如果项目在 $GOPATH/src 里,就会使用 $GOPATH/src 的依赖包,在 $GOPATH/src 之外,就会使用 go.mod 里 require 的包。
  • on 开启模式,go 1.12 后,无论项目是不是在 $GOPATH/src 里,都会使用 go.mod 里 require 的包。
  • off 关闭模式,就是原始的样子啦。

你的第一个helloworld例子

进入到一个目录,比如 ~/Projects/go(你可以自己选择,这里只是为了示意方便)。

~/Projects/go
➜ mkdir hello

~/Projects/go
➜  cd hello

~/Projects/go/hello
➜  go mod init world
go: creating new go.mod: module world

创建一个 go 文件 hellohello.go ,写上如下内容,并保存:

插播一下,这里使用 hellohello 作为文件名不是手误,而是故意的,为了说明一个问题,你也可以使用其它名称一做文件名,感兴趣请看go build

package main

import "fmt"

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

如果你机器上所安装的 go 环境是正常的,按照下面执行,结果是这样的:

~/Projects/go/hello
➜  ls
go.mod        hellohello.go

~/Projects/go/hello
➜  go run hellohello.go
hello world 😀😀😀

如果想把它编译成可执行程序,按照如下步骤,结果是:

~/Projects/go/hello
➜  go build hellohello.go

~/Projects/go/hello
➜  ls
go.mod        hellohello    hellohello.go

~/Projects/go/hello
➜  ./hellohello
hello world 😀😀😀

~/Projects/go/hello
➜  go build

~/Projects/go/hello
➜  ls
go.mod        hellohello    hellohello.go world

~/Projects/go/hello
➜  ./world
hello world 😀😀😀

这就是一个最简单的 go 程序。以上过程不小心把 go buildgo build hellohello.go 的差异也透露出来了,想知道这两者的差别,请看。

https://youwu.today//skill/backend/using-go-build-to-compile-your-go-program/

拆解

go mod init

在上面例子,go mod init world,其中的 world 表示所定义的模块名称,模块名称也可以是一个路径,比如 world/youwu.today。这个名称将决定了后续包引用时的前缀,若此时你还未涉及包依赖引用的,请忽略。

如果你使用 go build 来生成可执行程序,那么这个模块名称就是可执行程序的名称。如果是带有路径的,如使用 world/youwu.today,那么生成的可执行程序名称为 youwu.today。 具体可看文章 go build

go.mod

执行 go mod init world 命令,go 会生成一个依赖声明文件,文件名为 go.mod,内容如下:

module world

go 1.16

如果你执行 go mod init world/youwu.today,那么生成的 go.mod 内容长这样:

module world/youwu.today

go 1.16

规律尽在不言中。

如果你的程序引用了外部的go 程序库,使用 go mod tidy 或者 go get 包url路径 会帮助你将引用库的路径以及对应版本号记录到这个文件,不需要手动修改。

go mod tidy

go mod tidy 会把当前工程所须的依赖包下载到 GOPATH 的 pkg 目录缓存起来,使用go env GOPATH即可打印GOPATH默认路径~

实践中同步依赖操作

https://www.cnblogs.com/davis12/p/14987615.html

  • 初始化:go mod init 项目名
  • 检测依赖:go mod tidy
  • 下载依赖:go mod download
  • 导入依赖:go mod vendor

参考

https://youwu.today/skill/backend/using-go-modules/
https://youwu.today//skill/backend/using-go-build-to-compile-your-go-program/
https://learnku.com/articles/34091#464cf3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值