3.环境

予早 2024-12-09 22:44:28
Categories: Tags:

Software Development Kit

api
bin
doc
lib
misc
pkg
src
test
codereview.cfg
CONTRIBUTING.md
LICENSE
PATENTS
README.md
SECURITY.md
VERSION
# 版本信息
go version  # go version go1.20 windows/amd64

# 环境信息
go env

# 运行
go run main.go

go build .\main.go
go build -o xxx.exe .\main.go

# 格式化go源文件并输出到控制台
gofmt .\main.go

# 格式化go源文件并写到y
gofmt -w .\main.go

go version

查看版本

go get

安装依赖

got build、go install

这两个命令是用来编译包和依赖项的。go install 和 go build 在没有附加参数的情况下运行时都将编译当前目录下的包。如果包是 package main,那么 go build 将把生成的可执行文件放在当前目录中。go install 将把它放在 $GOPATH/bin (如果有多个参数将使用 $GOPATH 的第一个参数)下。另外,go install 将在 $GOPATH/pkg 中安装已编译的依赖项。要达到与 go build 相同的效果,可以使用 go build -i。如果包不是 main 包,go install 将会编译包,并安装在 $GOPATH/pkg 中。

go env

go test

基本环境变量

GOROOT,SDK安装目录

PATH,SDK的bin目录

GOPATH,go项目工作目录(确实不太灵活)

go doc

go fmt







go run与go build,build会将依赖和代码构建为exe文件,包含了go环境
go run运行,整个过程是动态的,需要加载go环境


注意事项:

  1. 源文件以.go为后缀
  2. 程序入口为main函数
  3. 代码区分大小写
  4. 大括号成对出现,且代码块的大括号必须为K&R风格否则编译报错
  5. Go语句无需手动添加分号,编译器会自动添加,手动添加是可以的
  6. Go编译器要求源代码中不能存在未使用的变量和包,否则编译时会报错

GoAPI中文文档:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com)

application programming interface

package main // 声明文件所在的包,每个go文件必须有归属的包
import "fmt" // 依赖的其他包

// 主函数,程序入口
func main() {
    fmt.Println("Hello World")
}

命令行参数

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Printf("%v\n", os.Args)
    for i, k := range os.Args {
        fmt.Println(i, k)
    }
}
package main

import (
    "flag"
    "fmt"
)

func main() {
    var (
        user     string
        password string
        host     string
        port     int
    )

    flag.StringVar(&user, "u", "root", "用户名")
    flag.StringVar(&password, "p", "123456", "密码")
    flag.StringVar(&host, "host", "127.0.0.1", "主机地址")
    flag.IntVar(&port, "port", 3306, "端口")
    flag.Parse()
    fmt.Println(user, password, host, port)
    //go run main.go -u admin -p admin -host 192.168.1.1 -port 6666
    //任何错误都会导致出现-help效果

}

gomod

go mod init modileName
go mod tidy //依赖关系处理
go mod vender //将依赖复制到verdor目录
go list -m all //显示依赖关系
go list -m -json all
go get github.com/Seekload/stringutil
包托管在一个分布式的版本控制系统上,比如Github等,并且是Public的权限

镜像

GOPROXY.IO - 一个全球代理 为 Go 模块而生

重启生效

需要区分 goroot

gopath

gomod

GOROOT:Go 安装路径,GOROOT/src 中为标准库

GOPATH:默认为安装用户目录下的 go 文件夹,GOPATH/src 中存储三方库,import 包查找时,先查找GOROOT再查找GOPATH

所有项目共享 GOPATH,GOPATH中同一个三方库仅可存在一个版本,当多项目使用同一三方库的不同版本时GOPATH无法解决该场景

GOVENDOR

Go 1.5 引入 go vendor 功能,用于解决 GOPATH 的问题,GO15VENDOREXPERIMENT=1,解决的思路就是,在每个项目下都创建一个 vendor 目录,每个项目所需的依赖都只会下载到自己vendor目录下,项目之间的依赖包互不影响。

其搜索包的优先级顺序,由高到低是这样的

Go 1.11 引入 go module 功能,使用环境变量GO111MODULE=on开启该功能,三方库将会存储在GOMODCACHE而不是GOPATH/src

无法集中管理:多个项目有使用同一个包的统一版本,那么该包在各个项目都会存在一份,浪费磁盘,无法统一管理

依赖一致管理:若要将该项目部署到其他机器,需要将所有依赖包同样移动到该机器,才可保证环境一致

GOMODCACHE=C:\Users\Davis Jones\go\pkg\mod,默认为$GOPATH/pkg/mod

go.mod 文件

第一行:模块的引用路径
第二行:项目使用的 go 版本
第三行:项目所需的直接依赖包及其版本

exclude: 忽略指定版本的依赖包
replace:由于在国内访问golang.org/x的各个包都需要f.q,你可以在go.mod中使用replace替换成github上对应的库。

module github.com/BingmingWong/module-test

go 1.14

require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pear // indirect
    example.com/strawberry // incompatible
)

exclude example.com/banana v1.2.4
replace(
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

go.sum 文件

gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=

每一行都是由 模块路径,模块版本,哈希检验值 组成,其中哈希检验值是用来保证当前缓存的模块不会被篡改。hash 是以h1:开头的字符串,表示生成checksum的算法是第一版的hash算法(sha256)。

有的包某个版本仅有一行 sum ,有的有两行

<module> <version>/go.mod <hash>
<module> <version> <hash>
<module> <version>/go.mod <hash>

那些有两行的包,区别就在于 hash 值不一行,一个是 h1:hash,一个是 go.mod h1:hash

而 h1:hash 和 go.mod h1:hash两者,要不就是同时存在,要不就是只存在 go.mod h1:hash。那什么情况下会不存在 h1:hash 呢,就是当 Go 认为肯定用不到某个模块版本的时候就会省略它的h1 hash,就会出现不存在 h1 hash,只存在 go.mod h1:hash 的情况。

go.mod 和 go.sum 是 go modules 版本管理的指导性文件,因此 go.mod 和 go.sum 文件都应该提交到你的 Git 仓库中去,避免其他人使用你写项目时,重新生成的go.mod 和 go.sum 与你开发的基准版本的不一致。

结论,使用 GOROOT 和 GOMODCACHE 即可

https://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU2MA%3D%3D&chksm=fa80dd0dcdf7541b641be90bdf39001a8ac417c418bb19b9ee7d9e493a0627cfe7d144bb2163&idx=1&mid=2247486618&scene=21&sn=bb5e76e011ba99ebc2ffb8f9d3c00b89#wechat_redirect