go入门-001-开发环境

安装go

Windows环境,下载msi文件,打开安装,一路next。默认会将Go放到 c:\Go ,同时会把 c:\Go\bin 加入PATH环境变量。

测试下hello,world:

工作空间

go是一门现代语言,当然要体现现代开发的风格,其中之一就是开源风格,Go代码必须放在工作空间内,它包含三个子目录:

  • src目录包含Go的源文件,它们被组织成包(每个目录都对应一个包),
  • pkg目录包含包对象,
  • bin目录包含可执行命令。

src目录通常包会含一个或多个版本控制的代码仓库,以此来跟踪一个或多个源码包的开发。go工具用于构建源码包,并将其生成的二进制文件安装到pkg和bin目录中。

官方教程的工作空间目录示例:

GOPATH环境变量

GOPATH环境变量指定工作空间位置。注意,它绝对不能和你的Go安装目录相同。

zhaww29579@WINDOWS-A4Q7LQG MINGW64 ~/Desktop
$ echo $GOPATH
D:\go_workspace

作为约定,将此工作空间的bin子目录添加到你系统环境变量PATH中:

$ export PATH=$PATH:$GOPATH/bin

包路径

标准库中的包有给定的短路径,比如"fmt"和"net/http"。对于你自己的包,你必须选择一个基本路径,来保证它不会与将来添加到标准库,或其它扩展库中的包相冲突。

如果你将你的代码放到了某处的源码库,那就应当使用该源码库的根目录作为你的基本路径。例如,若你在GitHub上有账户github.com/user那么它就应该是你的基本路径。

我的github账号名是caffebabe,所以用github.com/caffebabe作基本路径。

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

第一个程序

要编译并运行程序,首先要选择包路径,并在工作空间内创建相应的包目录:

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

接着,在该目录中创建名为 hello.go 的文件,其内容为以下Go代码:

package main

import "fmt"

func main() {
    fmt.Printf("Hello, world.\n")
}

现在你可以用 go 工具构建并安装此程序了:

$ go install github.com/caffebabe/hello

注意,你可以在系统的任何地方运行此命令。go工具会根据 GOPATH 指定的工作空间,在github.com/user/hello包内查找源码。

此命令会构建 hello,产生一个可执行的二进制文件。接着它会将该二进制文件作为 hello(在 Windows 下则为 hello.exe)安装到工作空间的 bin 目录中。

运行:

$ hello
Hello, world.

此命令生效是因为之前已经将 $GOPATH/bin 添加到 PATH 中了。

若你使用源码控制系统,那现在就该初始化仓库,添加文件并提交你的第一次更改了。

$ cd $GOPATH/src/github.com/caffebabe/hello
$ git init
$ git add hello.go
$ git commit -m "initial commit"
$ git remote add origin https://github.com/caffebabe/hello.git
$ git push -u origin master

第一个库

让我们编写一个库,并让 hello 程序来使用它。

同样,第一步还是选择包路径并创建包目录:

$ mkdir $GOPATH/src/github.com/caffebabe/stringutil

接着,在该目录中创建名为 reverse.go 的文件,内容如下:

// stringutil 包含有用于处理字符串的工具函数。
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 build 命令来测试该包的编译:

$ go build github.com/caffebabe/stringutil

这不会产生输出文件。想要输出的话,必须使用 go install 命令,它会将包的对象放到工作空间的 pkg 目录中。确认 stringutil 包构建完毕后,修改原来的 hello.go 文件:

package main

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

func main() {
    fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}

无论是安装包还是二进制文件,go工具都会安装它所依赖的任何东西。 因此当我们通过

$ go install github.com/caffebabe/hello

来安装 hello 程序时,stringutil包也会被自动安装。运行此程序的新版本,你应该能看到一条新的,反向的信息:

$ hello
Hello, Go!

测试

Go拥有一个轻量级的测试框架,它由 go test 命令和 testing 包构成。
我们可通过创建文件 $GOPATH/src/github.com/caffebabe/stringutil/reverse_test.go 来为 stringutil 添加测试,其内容如下:

package stringutil

import "testing"

func TestReverse(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }
    for _, c := range cases {
        got := Reverse(c.in)
        if got != c.want {
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
        }
    }
}

接着使用 go test 运行该测试:

$ go test github.com/caffebabe/stringutil
ok      github.com/caffebabe/stringutil 0.210s

GO IDE

选择自己熟悉的就行,我个人喜欢VS Code。CTR+SHIFT+X安装VS Code的GO扩展,CTR+SHIFT+P,输入GO:Install,选择安装/更新go工具。不出意外的话,会安装失败,因为被墙了。

解决办法很多,参考这篇博文的解决办法:

go env -w GOPROXY=https://goproxy.cn,direct

posted on 2020-07-17 12:30  caffebabe  阅读(158)  评论(0编辑  收藏  举报