开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
这次进入 Go 开发的实践篇,主要是编写 Go 程序所需的基础知识。
1. Hello World
- 定义自己的 module
go mod init example/hello
会创建go.mod文件。
- 这个文件定义了 module 的路径、requirements和其它元数据;
- 出现在 module 的根目录;
- 这个文件会跟踪代码中引用的来自其它 module 的 package。
- 创建
hello.go代码文件
package main
import "fmt"
func main {
fmt.Prinln("Hello World")
}
- 编译并执行
go run .
2. 使用外部的package
- 查找模块
可以在 pkg.go.dev 网站查找需要使用的 package 所在的 module
- 在代码中导入所需的 package
package main
import "fmt"
import "rsc.io/quote"
func main {
fmt.Prinln("Hello World")
fmt.Println(quote.Go())
}
- 增加新模块的 requirements 和 sums (校验和)
go mod tidy
- GO 会自己在
go.mod中增加关于新模块的 requirement - 如果新 module 不存在于 module cache 中,会进行下载并验证
- 当
go命令下载 module 的.zip文件或者go.mod文件时,会计算加密哈希并与 main module 的go.sum文件中记录的哈希进行比对,不一致则报错; - 如果
go.sum不存在该 module 的哈希,go命令会使用 checksum database 进行验证,验证通过后哈希添加到go.sum文件中; go.sum文件中包含 module 相关的两个哈希,一个是.zip文件的,一个是go.mod文件的。目前使用的 SHA-256 (h1)算法;
- 当
- GO默认会从谷歌的镜像源 proxy.golang.org 下载 module,但是国内访问不了。可以通过修改GOPROXY环境变量使用国内的GO模块代理:goproxy.cn/
go env -w GOPROXY=https://goproxy.cn
- 编译并执行
本节的目录结构
hello/
├── go.mod
├── go.sum
└── hello.go
module example/hello
go 1.18
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 是编译型语言
- module(模块):一组包的集合,它们被一起发布、版本化和分发。
- package(包):同一目录下、被一起编译的源文件的集合。注意:一个目录一个包。
- 包的导入路径是其模块路径+模块内子目录
go get/go mod tidy/go install的区别:go get只能在模块内使用,将模块的源码下载到 module cache,向go.mod文件中增加依赖;go mod tidy只能在模块内使用,增加模块或删除无用模块;go install编译并安装指定的包,可执行文件放在GOBIN或GOPATH/bin;在模块外使用时,必须注明要安装的版本