聊聊Go工作空间

栏目: Go · 发布时间: 7年前

内容简介:对于刚开始学Go的同学,可能会对几个概念比较迷糊:这个比较好理解,GOROOT表示的是go语言编译、工具、标准库等的安装路径(比如:(画重点)可自定义路径的工作空间-workspace,Go1.7之前必须设置这个变量,且不能够与Go的安装目录相同。1.8之后,GOPATH有默认值--

对于刚开始学 Go 的同学,可能会对几个概念比较迷糊: GOROOTGOPATH ,今天就来聊聊它们。 执行 go env ,给大家看下我开发环境的相关参数配置(部分):

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对应计算机的一个目录。 作用 :用来存放Go代码,Go的可运行文件,以及相应的编译之后的包文件。 Go代码必须放在工作空间内,workspace目录包含三个子目录

  • src 存放Go源代码,它们被组织成包(每个目录都对应一个包)
  • pkg 存放编译后生成的文件,比如:.a文件(静态库文件)
  • bin 存放编译后的可执行文件

我们可以通过go工具构建源码包,并将其生成的二进制文件安装到 pkg 和 bin 目录中。 我们实际操练下,上一节的 Hello World 入门程序就按照这种方式存放。在workspace创建相关目录src、pkg和bin,将写好的 hello.go 保存在 GOPATH/src/hello 目录。

聊聊Go工作空间
现在,我们就可以 go 工具构建并安装 hello.go
go install hello/
复制代码

我们可以在系统的任一目录中执行此命令,go 工具会根据指定的GOPATH,在 hello/ 包内查找源码(下一节给大家讲包的概念,现在大家了解概念就可以,不必深究)。若在包路径下执行 go install ,可以省略包路径。 go install 命令产生可执行的二进制文件,接着它会将该二进制文件安装到工作空间的 bin 目录中,例子中为 $GOPATH/bin/hello

聊聊Go工作空间
通过命令行 $GOPATH/bin/hello 来运行( $GOPATH

请自行替换)

聊聊Go工作空间
还有一种更简便的方法,直接执行可执行文件,不过这需要将 $GOPATH/bin

添加到 PATH 中。

聊聊Go工作空间

你的第一个库

编写一个库,并让hello程序来调用它。 在 $GOPATH/src 下创建包目录 github.com/Seekload/stringutil

聊聊Go工作空间
之后,在该目录中创建的文件 reverse.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)
}
复制代码

目录如图:

聊聊Go工作空间
go build

命令来测试该包的编译:

go build github.com/Seekload/stringutil
复制代码

也可以在包目录下直接执行 go build 。 这个命令不会产生输出文件。想要输出的话,必须使用 go install 命令,它会将编译之后的静态文件放到工作空间的 pkg 目录中。

聊聊Go工作空间
确认 stringutil

包构建完毕后,修改原来的 hello.go 文件并使用它:

package main

import (
	"fmt"
	"github.com/Seekload/stringutil"
)

func main() {
	fmt.Println(stringutil.Reverse("!oG ,daolkeeS"))
}
复制代码

执行 go install hello/ ,重新编译 hello.go ,生成可执行文件 hello 并执行:

聊聊Go工作空间
hello.go 中,我们引入了 github.com/Seekload/stringutil 包,所以重新执行 go intall hello/ 时, stringutil 包会被自动安装。 注意: go install github.com/Seekload/stringutil 是将 stringutil.a 放到 pkg/darwin_amd64 目录中,反映出其源码目录。 darwin_amd64

这部分能帮助跨平台编译,并反映出你的操作系统和架构。

这一节涉及了包的概念,有些同学可能还不太清楚。别急,将在下节给大家讲解Go语言中的包。

关注公众号「Golang来了」,获取最新文章!

聊聊Go工作空间

以上所述就是小编给大家介绍的《聊聊Go工作空间》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Defensive Design for the Web

Defensive Design for the Web

37signals、Matthew Linderman、Jason Fried / New Riders / 2004-3-2 / GBP 18.99

Let's admit it: Things will go wrong online. No matter how carefully you design a site, no matter how much testing you do, customers still encounter problems. So how do you handle these inevitable bre......一起来看看 《Defensive Design for the Web》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具