马上准备放假了,准备把Go学学,之前也断断续续看过,其中最搞不清的就是Go的工程结构以及对包的引用,今天又结合着官网的文档: How to Write Go Code学习了一遍,在此做一个总结
├── bin # 可执行的二进制文件,由 go install 或 go build 生成
├── pkg
│ └── ..... # object文件,包含了编译好的二进制代码,debug信息与源程序信息
└── src # 源代码文件
├── gitee.com
│ └── schwarzeni
│ └── ......
└── github.com
└── schwarzeni
└── ......
MacOS 10.13.2
GO v1.9
Intellij IDEA ULTIMATE 2017.1 (已经安装了Go插件并配好Go的SDK)
工程根路径 $HOME/goLearning/goInAction
在$HOME/.bash_profile中添加变量GOPATH并设置为当前工程路径,并source一下
export GOPATH=$HOME/goLearning/goInAction
当然直接在命令行中添加也可以
结束后在终端中输入 go env GOPATH
查看是否正确
此处配置便于在命令行中执行go的指令
当然,首先需要安装GO语言的插件
之后,在 Preference -> Languages && Frameworks -> Go -> Go Libraries 中的 Project Libraries 中添加工程的根路径,这样就可以愉快地享受IDE的对于自定义的package的补全提示了
按照官网的文章完成以下三个文件
....
└── src
└── github.com
└── schwarzeni
├── hello
│ └── hello.go
└── stringutil
├── reverse.go
└── reverse_test.go
以下是三个文件的内容
// $GOPATH/src/github.com/schwarzeni/hello/hello.go
package main
import (
"fmt"
"github.com/schwarzeni/stringutil"
)
func main() {
str := "Hello, world"
fmt.Println(stringutil.Reverse(str));
}
// $GOPATH/src/github.com/schwarzeni/stringutil/reverse.go
package stringutil
func Reverse(str string) string {
r := []rune(str)
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)
}
// $GOPATH/src/github.com/schwarzeni/stringutil/reverse_test.go
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 install github.com/schwarzeni/hello
如果一切顺利,那么在 bin 文件夹中会多出一个 hello 的可执行文件,执行它就会输出倒置的 “Hello, world”
如果是测试stringutil的话,则输入
go test github.com/schwarzeni/stringutil
当然,Intellij IDEA 也会在测试文件的左侧显示出一个绿色箭头,点那个也可以
那么要是出现如下情况呢
...
└── src
├── gitee.com
│ └── schwarzeni
│ └── stringutil
│ └── reverse.go
└── github.com
└── schwarzeni
├── hello
│ └── hello.go
└── stringutil
├── reverse.go
└── reverse_test.go
有多个包中用同名的文件,那么就对hello.go 如下修改就OK了
package main
import (
"fmt"
stringutilA "gitee.com/schwarzeni/stringutil"
stringutilB "github.com/schwarzeni/stringutil"
)
func main() {
str := "Hello, world"
fmt.Println(stringutilA.Reverse(str));
fmt.Println(stringutilB.Reverse(str))
}
有一些人质疑Go是否把工程结构搞得太复杂了,我觉得吧,这样看起来才条理清晰,毕竟隔壁Gradle的也对默认工程结构有一定的要求的嘛
另,Nodejs界大神TJ好像对GO十分看好呀。大神,快去造轮子吧 :-p