[开发语言 | Go] 实践笔记 01

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

这次进入 Go 开发的实践篇,主要是编写 Go 程序所需的基础知识。

1. Hello World

  1. 定义自己的 module

go mod init example/hello 会创建go.mod文件。

  • 这个文件定义了 module 的路径、requirements和其它元数据;
  • 出现在 module 的根目录;
  • 这个文件会跟踪代码中引用的来自其它 module 的 package。
  1. 创建hello.go代码文件
package main

import "fmt"

func main {
    fmt.Prinln("Hello World")
}
  1. 编译并执行

go run .

2. 使用外部的package

  1. 查找模块

可以在 pkg.go.dev 网站查找需要使用的 package 所在的 module

  1. 在代码中导入所需的 package
package main

import "fmt"

import "rsc.io/quote"

func main {
    fmt.Prinln("Hello World")
    fmt.Println(quote.Go())
}
  1. 增加新模块的 requirements 和 sums (校验和)

go mod tidy

  • GO 会自己在go.mod中增加关于新模块的 requirement
  • 如果新 module 不存在于 module cache 中,会进行下载并验证
    • go命令下载 module 的 .zip文件或者 go.mod文件时,会计算加密哈希并与 main modulego.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

  1. 编译并执行

本节的目录结构

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编译并安装指定的包,可执行文件放在GOBINGOPATH/bin;在模块外使用时,必须注明要安装的版本