Go工程目录结构
date
Apr 3, 2023
slug
goprojectdir
status
Published
tags
Golang
summary
type
Post
Go环境变量
Go是通过环境变量来做项目上的管理和控制,通过
go env
查看相关变量$ go env
GO111MODULE="on"
GOARCH="arm64"
GOBIN=""
GOCACHE="/Users/lei/Library/Caches/go-build"
GOENV="/Users/lei/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/lei/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/lei/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/opt/homebrew/Cellar/go/1.20.2/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/opt/homebrew/Cellar/go/1.20.2/libexec/pkg/tool/darwin_arm64"
GOVCS=""
GOVERSION="go1.20.2"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-O2 -g"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-O2 -g"
CGO_FFLAGS="-O2 -g"
CGO_LDFLAGS="-O2 -g"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/zf/cdys_qnx0l5645_h5dzfnpn40000gn/T/go-build2219344192=/tmp/go-build -gno-record-gcc-switches -fno-common"
关键环境变量:
GOROOT
:Go
的安装目录,即可执行文件所在的目录;
GOPATH
:Go
的工作目录,是import
包的搜索路径,主要包含:bin
:存放编译后的可执行文件pkg
:依赖包编译后的*.a文件src
:存放源码文件,以代码包为组织形式
GOBIN
:GO 程序生成的可执行文件(executable file)的路径;
GO111MODULE
:启用go module
管理项目;
GOPROXY
:下载依赖时的代理,必须配置,不然无法成功下载;
GoPath
设置GOPATH的意义:
- GoPath 可以简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。
- 我们需要利于这些工作区,去放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。
GoModule
但因GoPath模式下第三方类库管理麻烦,从go v1.11开始引入GoModule,可阅读 GoModules使用 。
用环境变量
GO111MODULE
开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。- off:无模块支持,go 沿用旧版本那中在
GOPATH
和vendor
文件夹寻找包。
- on:模块支持,go 会忽略
GOPATH
和vendor
文件夹,只根据go.mod
下载依赖。
- auto:在
$GOPATH/src
外面且根目录有 go.mod 文件时,开启模块支持。
在使用模块的时候,
GOPATH
是无意义的,不过它还是会把下载的依赖储存在$GOPATH/src/mod
中,也会把 go install 的结果放在$GOPATH/bin
中。参考资料:
GoPath 用来存放我们从网上拉取的第三方依赖包,而 GoModule 用来存放我们自己的Golang 项目文件,当项目需要依赖第三方包时,我们通过 GoModule 目录下的一个
go.mod
文件来引用 GoPath 目录pkg/mod
文件夹下的第三方依赖即可。这样既解决了原来只能局限在GoPath
目录src
包下进行编程的问题,也解决了第三方依赖包难以管理和重复依赖占用磁盘空间的问题。