聊聊Go工作空间

Seek · · 1148 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

### 前言 对于刚开始学Go的同学,可能会对几个概念比较迷糊:`GOROOT`和`GOPATH`,今天就来聊聊它们。 执行`go env`,给大家看下我开发环境的相关参数配置(部分): ```go GOARCH="amd64" GOBIN="/Users/chengguilu/goProjects/bin" GOCACHE="/Users/chengguilu/Library/Caches/go-build" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/chengguilu/goProjects" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++" ``` ### GOROOT 这个比较好理解,GOROOT表示的是go语言编译、工具、标准库等的安装路径(比如:`/usr/local/go`),简而言之,就是安装路径,GO安装好之后就有了。 ### GOPATH **(画重点)** 可自定义路径的工作空间-workspace,Go1.7之前必须设置这个变量,且不能够与Go的安装目录相同。1.8之后,GOPATH有默认值--`$HOME/go`。可以执行`go env GOPATH`查看,从上面可以看到,我的GOPATH是`/Users/chengguilu/goProjects`。其实,说白了,GOPATH对应计算机的一个目录。<br> **作用**:用来存放Go代码,Go的可运行文件,以及相应的编译之后的包文件。 Go代码必须放在工作空间内,workspace目录包含三个子目录 - src 存放Go源代码,它们被组织成包(每个目录都对应一个包) - pkg 存放编译后生成的文件,比如:.a文件(静态库文件) - bin 存放编译后的可执行文件 我们可以通过go工具构建源码包,并将其生成的二进制文件安装到 pkg 和 bin 目录中。<br> 我们实际操练下,上一节的`Hello World`入门程序就按照这种方式存放。在workspace创建相关目录src、pkg和bin,将写好的`hello.go`保存在`GOPATH/src/hello`目录。<br> ![image.png](https://static.studygolang.com/190115/7b81601ca00712f9604fe14e3c71af02.png) <br> 现在,我们就可以 go 工具构建并安装`hello.go` ```go go install hello/ ``` 我们可以在系统的任一目录中执行此命令,go 工具会根据指定的GOPATH,在 `hello/` 包内查找源码(下一节给大家讲包的概念,现在大家了解概念就可以,不必深究)。若在包路径下执行`go install`,可以省略包路径。<br> `go install`命令产生可执行的二进制文件,接着它会将该二进制文件安装到工作空间的 bin 目录中,例子中为 `$GOPATH/bin/hello`。<br> ![image.png](https://static.studygolang.com/190115/275a076d0584899e2d1ccba0575c1f22.png) <br> 通过命令行`$GOPATH/bin/hello`来运行(`$GOPATH`请自行替换) <br> ![image.png](https://static.studygolang.com/190115/25ade7c113d6bd8916315c182ea22917.png) <br> 还有一种更简便的方法,直接执行可执行文件,不过这需要将`$GOPATH/bin` 添加到 PATH 中。 <br> ![image.png](https://static.studygolang.com/190115/bb04026c9ac7348a55806c7d821e3b30.png) <br> ### 你的第一个库 编写一个库,并让hello程序来调用它。 在`$GOPATH/src`下创建包目录`github.com/Seekload/stringutil`<br> ![image.png](https://static.studygolang.com/190115/7b3329187ef51da03b4d2e9e5671658d.png) <br> 之后,在该目录中创建的文件`reverse.go `并保存(文件看不懂没关系,随着学习深入,相关知识点都会讲到,这里只做演示使用): ```go package stringutil // Reverse 将其实参字符串以符文为单位左右反转。 func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) } ``` <br>目录如图:<br> ![image.png](https://static.studygolang.com/190115/3e533a5e9bd2c6862090cdc7e3b8dc8b.png) <br> 用 `go build ` 命令来测试该包的编译:<br> ```go go build github.com/Seekload/stringutil ``` <br>也可以在包目录下直接执行`go build`。 这个命令不会产生输出文件。想要输出的话,必须使用 `go install` 命令,它会将编译之后的静态文件放到工作空间的 pkg 目录中。<br> ![image.png](https://static.studygolang.com/190115/46ed51736a51b1ea970bd5fd995d7fe4.png) <br> 确认 `stringutil`包构建完毕后,修改原来的 hello.go 文件并使用它:<br> ```go package main import ( "fmt" "github.com/Seekload/stringutil" ) func main() { fmt.Println(stringutil.Reverse("!oG ,daolkeeS")) } ``` 执行`go install hello/`,重新编译`hello.go`,生成可执行文件`hello`并执行:<br> ![image.png](https://static.studygolang.com/190115/bf07e0ff7b5f3b75916c4c7a865916d9.png) <br> 在`hello.go`中,我们引入了`github.com/Seekload/stringutil` 包,所以重新执行`go intall hello/`时,`stringutil` 包会被自动安装。<br> **注意**:`go install github.com/Seekload/stringutil` 是将 `stringutil.a` 放到 `pkg/darwin_amd64` 目录中,反映出其源码目录。 `darwin_amd64` 这部分能帮助跨平台编译,并反映出你的操作系统和架构。 这一节涉及了包的概念,有些同学可能还不太清楚。不急,将在下节给大家讲解 Go 语言中的包。<br><br><br> **关注公众号「Golang来了」,获取最新文章!** <center>![image.png](https://static.studygolang.com/190115/c2746f844a56be9e9170c01628506dd9.png)</center>

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1148 次点击  ∙  2 赞  
加入收藏 微博
被以下专栏收入,发现更多相似内容
4 回复  |  直到 2019-01-15 16:12:21
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传