- 文档
- 教程
【免费下载链接】build-web-application-with-golang
A golang ebook intro how to build a web with golang
本篇技术指南以开源电子书 build-web-application-with-golang 的西班牙语版第 1.2 章(es/01.2.md)为骨架,系统讲解 Go 语言经典工作区模型$GOPATH的配置方法、src/pkg/bin三目录结构、自定义包的创建与编译(go install)、以及用go get安装远程包的完整流程。读完本文,你将能独立搭建一个规范的 Go 工作区,创建并编译自己的可复用包,理解包路径与导入路径之间的对应关系,并在本仓库的配套代码中直接验证每一步结果。
一、$GOPATH:Go 所有命令赖以工作的环境变量
1.1 GOPATH 与 GOROOT 的区别
Go 的所有命令都依赖一个重要的环境变量$GOPATH。需要特别注意:它并不是$GOROOT——$GOROOT表明 Go 工具链安装在哪里,而$GOPATH指向的是你计算机上的 Go 工作区(workspace),即存放本机全部 Go 代码的目录。原文以/home/apple/mygo作为作者机器上的示例路径,如果你没有相同的目录结构,请替换为你自己的路径。
1.2 不同操作系统下的设置方式
Unix 系系统,在 shell 中导出变量(建议追加写入~/.profile以便每次登录自动生效):
export GOPATH=/home/apple/mygoWindows 系统:需要新建一个名为GOPATH的环境变量,然后把它的值设为c:\mygo(该值取决于你的工作区实际位置)。在 Windows 下引用环境变量的写法是%GOPATH%。
补充一点来自仓库英文版同章节(en/01.2.md)的事实:从 Go 1.8 开始,如果未显式设置,GOPATH会有一个默认值——Unix 下默认为$HOME/go,Windows 下默认为%USERPROFILE%/go。这大大降低了新手的上手门槛,但显式设置仍然是管理多项目、多工作区时的推荐做法。
1.3 多工作区路径与go get的行为
$GOPATH中配置多条工作区路径是允许的,但必须用:分隔(Windows 用;)。此时需要注意一个关键行为:go get会把内容保存到$GOPATH的第一条路径。仓库英文版还特别强调了遵循目录规范的重要性——不要在$GOPATH内直接以自己的项目名建目录,否则包会以裸名<packagename>被引用,导致所有通过go get导入该包的应用程序找不到它,破坏 Go 语言希望借由路径规范带来的包管理便利。约定之所以存在,是因为它有存在的理由。
1.4 工作区必须包含的三个目录
在$GOPATH下,必须准备以下三个目录,各司其职:
| 目录 | 存放内容 | 说明 |
|---|---|---|
src | 源码文件 | 后缀为.go、.c、.g、.s的源文件 |
pkg | 编译产物 | 后缀为.a的归档(编译好的包二进制) |
bin | 可执行文件 | go install生成的可执行程序 |
本书中作者统一使用mygo作为$GOPATH中的唯一路径。
二、包目录:创建你的第一个包 mymath
2.1 目录名与包名的约定
创建包的源码文件与目录,规范形态如$GOPATH/src/mymath/sqrt.go(mymath就是包名)。作者用mymath作为包名,同时也用这个名字作为存放该包源码文件的目录名。
每创建一个包,就应在src目录下新建一个文件夹,文件夹名称通常与将要使用的包名一致(仓库英文版补充:main包是例外,不必强制建main目录)。目录支持多级嵌套:例如创建目录$GOPATH/src/github.com/astaxie/beedb,那么包路径(即导入路径)就是github.com/astaxie/beedb,而包名取路径的最后一级目录名,即beedb。
2.2 动手创建 mymath 包
按下面的命令逐步执行:
cd $GOPATH/src mkdir mymath然后在mymath目录下新建文件sqrt.go,写入以下内容:
// Código fuente de $GOPATH/src/mymath/sqrt.go package mymath func Sqrt(x float64) float64 { z := 0.0 for i := 0; i < 1000; i++ { z -= (z*z - x) / (2 * x) } return z }这段代码用牛顿迭代法(切线逼近法)实现平方根计算:从一个初始猜测z = 0.0出发,反复用公式z -= (z*z - x) / (2 * x)逼近真实平方根,迭代 1000 次后返回结果。需要注意,这里迭代公式中的(2 * x)在x为 0 时会触发除零(结果为 NaN),因此该实现主要用于教学演示,实用场景建议直接使用标准库math.Sqrt。
2.3 仓库源码印证
本仓库把书中的mymath包原样收录在 es/code/src/mymath/sqrt.go,其Sqrt函数与书中代码逐行一致,注释也说明该包必须被其他 Go 文件 import 后才能运行。这正是第 1.2 章所述"目录包含该包全部源码"约定的直接体现。
三、编译包:go install 与 .a 归档文件
包创建好之后,如何把它编译成可供其他程序链接的产物?有两种方式:
- 把当前工作路径切换到包目录,然后执行
go install; - 不切换目录,直接在命令中给出包名作为参数:
go install mymath。
编译完成后,可以打开下面这个目录查看产物:
cd $GOPATH/pkg/${GOOS}_${GOARCH} // 你可以看到生成的文件 mymath.a这里的${GOOS}_${GOARCH}是 Go 按目标操作系统与 CPU 架构生成的子目录名,例如darwin_amd64(macOS/64 位 x86)、linux_amd64(Linux/64 位 x86)、windows_amd64等。后缀为.a的文件就是包的二进制归档——它包含了包编译后的全部导出符号,供其他程序在编译链接时使用。
关于go install与go build的分工,仓库下一章 es/01.3.md 给出了更精确的说明,可概括为:
go build主要用于编译验证:如果编译的是非main包(如mymath),不会生成任何文件;只有main包才会在同目录产出可执行文件;go install会编译所有包并生成产物,然后移动到$GOPATH/pkg或$GOPATH/bin——这正是本章选择go install的原因:只有它会把.a归档放进pkg目录。
四、使用包:创建可执行应用 mathapp
有了.a归档还不够,我们必须创建一个新的应用程序来使用它。下面创建一个名为mathapp的应用:
cd $GOPATH/src mkdir mathapp cd mathapp vim main.go在main.go中写入以下代码:
//$GOPATH/src/mathapp/main.go código fuente package main import ( "mymath" "fmt" ) func main() { fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2)) }main包通过import "mymath"引入上一节编译好的包,并在main函数中调用mymath.Sqrt(2)输出结果。
编译并运行:
cd $GOPATH/src/mathapp go install ./mathapp此时应看到$GOPATH/bin/下生成了名为mathapp的可执行文件,终端输出:
Hello world. Sqrt(2) = 1.414213562373095Sqrt(2)的输出与math.Sqrt(2)的真值1.4142135623730951在浮点精度范围内一致,说明包的编译、链接、调用全链路已经打通。
仓库内直接验证
本书配套代码把这一示例收录在 es/code/src/apps/ch.1.2/main.go:它同样import "mymath"并打印Sqrt(2)的结果,文件头注释给出了验证方法——进入该目录执行go run main.go,如果屏幕上没有出现 "Hello World",就说明工作区没有配置好。配套的 en/code/readme.md 还建议:把GOPATH环境变量指向该 code 目录本身(该目录下直接包含src/),这样仓库内的mymath包路径就能被正确解析,你可以在不改动任何代码的前提下完整复现本章的编译与运行流程。
五、安装远程包:go get
Go 提供了一条安装远程包的命令go get,它支持绝大多数开源代码托管社区,包括 GitHub、Google Code、BitBucket 和 Launchpad。例如安装本书作者 astaxie 的 beedb 数据库 ORM 包:
go get github.com/astaxie/beedb使用go get -u ...可以更新远程包,并且会自动安装它依赖的所有包。
5.1 前置条件:版本控制工具
go get会根据不同的代码托管平台调用不同的版本控制工具,例如 GitHub 用git、Google Code 用hg(Mercurial)。因此在使用go get之前,必须先把对应平台的版本控制工具安装好并配置到$PATH。各平台与工具的对应关系可参考仓库 es/01.3.md 中的说明(BitBucket → Mercurial/Git,GitHub → Git,Google Code → Git/Mercurial/Subversion,Launchpad → Bazaar)。
5.2 go get 的工作流程与目录结构
执行完上面的go get命令后,$GOPATH下的目录结构应变为:
$GOPATH src |-github.com |-astaxie |-beedb pkg |--${GOOS}_${GOARCH} |-github.com |-astaxie |-beedb.a实际上,go get做两件事:先把远程源码克隆到本地$GOPATH/src(按托管域名/用户名/仓库名组织路径),然后自动执行go install,把编译好的归档放进$GOPATH/pkg/${GOOS}_${GOARCH}。
5.3 使用远程包
远程包的使用方式与本地包完全一致,直接在代码中按完整包路径导入即可:
import "github.com/astaxie/beedb"这与前文$GOPATH/src/github.com/astaxie/beedb的目录结构一一对应——Go 的导入路径就是相对src的目录路径,这也是为什么规范的组织方式如此重要。
六、完整目录结构总览
如果你完整跟随了上述所有步骤,工作区最终的结构如下:
bin/ mathapp pkg/ ${GOOS}_${GOARCH}, como darwin_amd64, linux_amd64 mymath.a github.com/ astaxie/ beedb.a src/ mathapp main.go mymath/ sqrt.go github.com/ astaxie/ beedb/ beedb.go util.go现在目录结构一目了然:
bin存放可执行文件(这里是mathapp);pkg存放编译后的包归档(本地包mymath.a与远程包beedb.a,均按${GOOS}_${GOARCH}平台子目录组织);src存放全部包源码(本地包mymath、应用mathapp、远程克隆的beedb)。
这套GOPATH工作区模型是 Go 语言在引入 Modules 之前(本书写作于 Go 1.0~1.5 时代,安装示例可见 es/01.1.md)官方推荐的标准开发组织方式,理解它对阅读老项目、参与开源协作仍有直接价值。
七、Windows 用户注意事项
Windows 下环境变量的引用格式是%GOPATH%(例如cd %GOPATH%\src),路径分隔符使用;,而本书整体以 Unix 风格为主,因此 Windows 用户需要自行做相应替换。如果使用 Windows 安装包安装 Go,安装程序会自动配置好PATH等基础变量,但GOPATH仍需要像 1.2 节所述那样手动新建。
八、相关章节导航
- 章节总目录:es/preface.md
- 上一节(Go 环境安装):es/01.1.md
- 下一节(Go 命令行工具详解,含
go build、go clean、go fmt、go test、go doc等):es/01.3.md
- 文档
- 教程
【免费下载链接】build-web-application-with-golang
A golang ebook intro how to build a web with golang
相关推荐
Build Web Application with Golang 精读(1.2):$GOPATH 与 Workspace 工作区的完整实战指南
Build Web Application with Golang 精读(1.2):$GOPATH 与 Workspace 工作区的完整实战指南 本文是《Bui
文档教程Baserow Helm Chart 实战指南:Kubernetes 全栈部署、域名路由、按需 TLS 与云厂商适配
Baserow Helm Chart 实战指南:Kubernetes 全栈部署、域名路由、按需 TLS 与云厂商适配 Baserow 是基于 Django 与
文档教程构建 Go 开发环境:从安装、GOPATH 工作区到命令行工具与编辑器(Build Web Application with Golang 第 1 章)
构建 Go 开发环境:从安装、GOPATH 工作区到命令行工具与编辑器(Build Web Application with Golang 第 1 章) 本文基
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考