码迷,mamicode.com
首页 > 其他好文 > 详细

Go 工作空间 深度解析

时间:2015-05-06 13:26:26      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:golang

本文章来自于 谷歌官方的翻译: How to Write Go Code?
http://godoc.golangtc.com/doc/code.html

介绍

这篇文档举例证明了一个简单地 Go package 并且介绍了 go tool,标准的方法来 fetch, build,and install Go package and commands.

如果要使用 go tool,那么就必须将代码组织成一种特殊的形式。 请仔细的阅读这篇文档,它会教你采用最简单的方法来安装运行你的Go程序。

代码组织

Workspace 工作空间

Go tool 被设计成用来开源公共仓库中的代码,尽管或许你不需要发布你的代码, 但是环境的设置还是一样的。

Go的源代码必须存放在 workspace中。 workspace 是一个目录(directory hierachy),在这个目录下有三个子目录

  • src 包含 Go 源代码文件, 源代码文件组织成 packages (one package per directory)
  • pkg 包含 package objects (二进制的包)
  • bin 包含 可执行的命令 command(可执行的二进制文件)

go tool 编译(build) 源代码文件(source packages),并且将 resulting binaries 安装在 pkgbin 目录下面。

src 目录下面包含多个 版本控制的仓库, (比如 Git 或者 Mercurial) 用来 跟踪一个或者多个 source package的开发进度。

下面给你一个真实环境中的 workspace 是什么样子的:

bin/
    hello              # 可执行的命令
    outyet             # 可执行的命令
pkg/
    linux_amd64/
        github/golang/example/
            stringutil.a          # pakcage objects
src/
    github.com/golang/example/
        .git/                     # git repository metadata
        hello/
            hello.go              # command source
        outyet/
            main.go               # command source
            main_test.go          # test source
        stringuitl/
            reverse.go            # package source
            reverse_test.go       # test source

这个工作空间 包含一个 代码仓库repository( example仓库),example 仓库由两个命令 command (hello, outyet)和一个库library组成(stringutil)

一个典型的 workspace 会包含多个 source repositories,包含很多 pakcages 和 commands。

大部分的 Go programmers 会 keep all their Go source code and dependencies in a single workspace. (将所有的Go源代码和依赖保存在一个工作空间中)。

另外 从上述例子中也可以看到, bin/ 中命令的名字,pkg/中库的名字 都是文件夹的文字。 src/中包的名字和你 import 时候的名字不一定一样,这一点要区别。

GOPATH 环境变量

GOPATH 环境变量 指明了 你的工作空间的位置。 它很可能是你在编写Go代码的时候需要唯一设置的环境变量。

开始编程:
1. 创建一个工作空间目录。
2. 设置 GOPATH 环境变量。

GOPATH目录可以是任意的,唯一的要求是不能是你安装Go时的目录(/usr/local/go)。

$ mkdir $HOME/go
$ export GOPATH=$HOME/go

为了方便,将工作空间的 bin 子目录 加入到 你的 PATH 环境变量中。

$ export PATH=$PATH:$GOPATH/bin

Package pathes 包路径

packages path 不是 library path,虽然二者有联系。
标准库中的包,是由短路径(short path)决定的,比如 “fmt”和”net/http”。对于你自己的包,你必须选择一个 base path,这个base path不能和别的包路径冲突。

如果你将你的代码保存在一个 源仓库中(source repository),那么你应该使用 the root of that source repository as your base path.
比如你有一个 GitHub账号: github.com/usr,这 应该是你的 base path.

注意: 你或许不需要发布你的代码 to remote repository before you can build it. 但是将代码组成成 code repository是一个好的习惯。

举例:我们使用 github.com/usr作为你的base path. 在你的workspace中创建一个目录来保存你的代码。

$ mkdir -p $GOPATH/src/github.com/usr

第一个 program

为了编译和运行一个简单地程序,首先选择一个 package path(这里使用 github.com/usr),创建一个 package directory (包目录)

$ mkdir $GOPATH/src/github.com/usr/hello

第二:在包目录下创建一个文件 名为 hello.go,包含如下的代码

package main

import "fmt"

func main() {
    fmt.Println("Hello, World.\n")
}

第三: 使用 go tool 来 build and install 这个程序

$ go install github.com/user/hello

注意: 你可以你的计算机的任何文件夹下面运行这个命令。 go tool 会在 $GOPATH 指定工作空间下面搜索 github.com/usr/hello 这个包,并且编译安装这个包。

当然, 如果你在 package directory 下面运行 go install 你就可以忽略 package path。

$ cd $GOPATH/github.com/usr/hello
$ go install

这个命令会 build the hello command, 产生一个可执行的二进制文件。然后将这个可执行的二进制文件安装到工作目录的 bin目录下面,文件名称为 hello (在Windows下面为 hello.ext,可以看到可执行二进制文件名称和目录的名称保持一致)。 在我们的例子中是: $GOPATH/bin/hello,也就是 $HOME/go/bin/hello

当有错误发生的时候,go tool只会 print output,而不会产生二进制文件。 如果这些命令没有产生 output(输出),就表示他们运行成功了。

现在你可以 通过输入 hello命令的全名 来运行这个命令了

$ $GOPATH/bin/hello
hello, world

或者如果你已经将 $GOPATH/bin 加入到 PATH中:

$ hello
hello, world

如果你使用源代码版本控制系统,现在这是一个好的时机来 initialize a repository, add the files,and commit you first chagne. Again, this step is optional: you do not need to use source control to write Go code.

$ cd $GOPATH/src/github.com/usr/hello
$ git init
Initialized empty Git repository in /home/user/go/src/github.com/user/hello/.git/
$ git add hello.go
$ git commit -m "initial commit"
[master (root-commit) 0b4507d] initial commit
  1 file chagned, 1 insertion(+)
      create mode 100644 hello.go

将代码 Push 到远程的仓库留作读者作为一个联系吧。

第一个 Library

现在我们写一个 Library,并且在 hello 程序中使用这个库。

  1. 首先, 选择一个 package path (我们使用 github.com/user/stringutil),创建这个 package directory
$ mkdir $GOPATH/src/github.com/usr/stringutil
  1. 在这个目录中创建一个文件 reverse.go
// Package stringutil contains utility functions for working with strings.

//Reverse returns its argument string reversed run-wise left to right.
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)
}
  1. 测试 这个 pckage compiles with 命令 go build:
$ go build github.com/user/stringutil

或者你在 这个目录下面,只需要

$ go build

即可。

  1. go build 不会产生任何的文件。 我们需要使用 go install 可以 将 package object 放置在 workspace下的 pkg目录下。
$ go install
  1. 为了确认 stringutil 已经建立(build),我们需要修改 hello.go 文件。
package main
import (
    "fmt"
    "github.com/usr/stringutil"
)

func main() {
    fmt.Printf(stirngutil.Reverse("!oG, olleH"))
}
  1. 当 go tool 安装一个 package 或者 一个 binary(可执行二进制),它也会 installs whatever dependencies it has (安装它所依赖的文件). 所以当你 intall hello 程序的时候
$ go install github.com/user/hell

stringutil 也会自动安装。

运行新版本的程序,你会看见如下结果:

$ hello
Hello, Go!

经过了上述的步骤,你的工作空间现在应该是下面的情况:

bin/
    hello                 # command executalbe 可执行命令
pkg/
    linux_amd64/          # this will reflect you OS and architecture
        github.com/usre/
            stringutil.a  # package object
src/
    github.com/user/
        hello/
            hello.go      # command source
        stringutil/
            reverse.go    # package source

可以看到, go installstringutil.a放置在 pkg/linux_amd64的目录下, 这个目录 mirrors its source directory. 这是因为 以后 go tool 会找到 package object,并且会避免重新编译。 linux_amd64是为了平台交叉编译,将会反映你的操作系统和计算机的体系结构。

Go command exectualbes are statically linked。(go command 执行是静态链接的) The package objects need not be present to run Go program.(pakcage object 在Go程序执行的时候是不需要的)。

Go 工作空间 深度解析

标签:golang

原文地址:http://blog.csdn.net/xiaorenwuzyh/article/details/45532913

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!