Golang 基础(一)

1. package management

go package management
1. history
2. go modules

GOPATH: Unified package storage path
- not support version control of dependency packages

GOPATH mode: use GOPATH to manage
GOPATH: the path
不是使用GOPATH模式就一定是使用GOPATH路径

GOROOT是go installation path,存放Build-in pkgs
GOPATH是 designated workspace
GOROOT 和 GOPATH 不能相同目录,否则包名冲突

GOPATH mode下,工程代码必须放在GOPATH/src

go get:
1. git clone to $GOPATH/src
2. go install (-d 不执行install)

go install:
1. generate executable binary file -> $GOPATH/bin
普通包:编译生成.a结尾的文件放到$GOPATH/pkg
(编译缓存,提升编译速度)

what is executable? has main() function

为什么需要go install?
因为go get要从remote repo,如果想用local repo,就用go install
1.15版本后go install会再判断没有local时拉取远程

go build
Output compiled files to the current directory

go run
用于测试,compile and run main()

GOPATH directory:
/src: source code
/pkg: compiled files
/bin: compiled .exe

GO MODULES
GO111MODULE = auto -> 根据项目是否在GOPATH dir 判断什么模式

go env -w GO111MODULE = on

如何变成module形式?
1. set GO111MODULE = on (windows)
2. go mod init <name>
(generate go.mod)

go mod tidy
1. 没有的包就下载
2. 多余的包就删除

如果go.mod和go.sum包含某个包,却没有下载到本地?
- go mod download

go mod vendor

go.sum
- 本地缓存有依赖包,计算包的hash并与go.sum对比
- 保证依赖的module version 不会被篡改(not tampered with)

go.sum中记录比go.mod多?
.mod依赖包包含go.mod -> 不记录;不包含 -> 记录indirect dependency
.sum: all

dependency pkg storage:
GOPATH mode: $GOPATH/src
GOMODULE mode: $GOPATH/pkg/mod

2. 

 

internal文件夹内的包只能被父目录下的包或者子包导入
内部开发的包导入:
1. 本地包
2.private repo

 

init()方法顺序
1.同个go文件多个init(),按照定义的顺序执行
2.同package不同文件,按照文件顺序
3.
--pkg1
--pkg2依赖pkg3
执行顺序:pkg1,pkg3,pkg2
3. 依赖包按照导入顺序

 

go文件init顺序
1. 依赖包
2. var/const
3. init()
4. main()

 

一个包被引用多次,但是init()只会执行一次
所有init()都在同一个goroutine执行

 

获取root目录?
filepath.Abs("./")是:执行command的路径
os.Getwd()一样的
os.Args[0]
filepath.Abs(path.Dir(os.Args[0]))

 

posted @ 2023-11-06 20:48  PEAR2020  阅读(42)  评论(0)    收藏  举报