一、安装
- 安装go
- 安装goland
我的安装信息如下:
PS C:\Users\z15075> go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\z15075\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\z15075\go
set GOPROXY=
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\z15075\AppData\Local\Temp\go-build2328876
38=/tmp/go-build -gno-record-gcc-switches
PS C:\Users\z15075>
由于没有设置GOPATH环境变量,所以会使用默认的路径作为GOPATH:
PS C:\Users\z15075\go> pwd
Path
----
C:\Users\z15075\go
二、Go代码组织结构
1、概述
- Go程序员一般会把Go代码放在单独的工作空间(workspace)
- 工作空间会包含很多版本控制仓库(repository),如git
- 每个仓库包含一个或多个包(package)
- 每个包由单个目录下的一个或多个go源文件组成
- 到包目录的路径决定了这个包的引入路径
2、工作空间
工作空间是一个目录,包含两个子目录:
- src 包含go源文件,每个子目录以git仓库形式组织管理
- bin 包含可执行命令,go工具安装后的二进制文件
3、第一个go应用
使用goland开发工具,新建go工程,location为:
C:\Users\z15075\go\src\github.com\user\hello
创建hello.go源文件,内容为:
package main
import "fmt"
func main() {
fmt.Println("Hello, world.")
}
编译或安装,可看到bin目录下有hello.exe文件。
go install
使用git bash或者goland vcs将该项目加入git管理:
git init
git add *
git commit -m "initial commit"
在github新建仓库hello,在本地添加该远程仓库,并push
git remote add origin https://github.com/zhabit/hello.git
git push -u origin master
4、第一个库
使用goland开发工具,新建go工程,location为:
C:\Users\z15075\go\src\github.com\user\stringutil
创建reverse.go源文件,内容为:
package stringutil
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)
}
创建reverse_test.go源文件,测试Reverse方法,内容为:
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 build
go build构建时,会把结果输出到go build cache目录:
set GOCACHE=C:\Users\z15075\AppData\Local\go-build
在hello项目中引入该库:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
//fmt.Println("Hello,World!")
fmt.Println(stringutil.Reverse("!oG ,olleH"))
}