GO的工程结构以及与Intellij IDEA 的配合

前言

马上准备放假了,准备把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的工程结构以及与Intellij IDEA 的配合_第1张图片

Intellij IDEA 中的配置

当然,首先需要安装GO语言的插件

之后,在 Preference -> Languages && Frameworks -> Go -> Go Libraries 中的 Project Libraries 中添加工程的根路径,这样就可以愉快地享受IDE的对于自定义的package的补全提示了

GO的工程结构以及与Intellij IDEA 的配合_第2张图片


编写程序

按照官网的文章完成以下三个文件

....
└── 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 也会在测试文件的左侧显示出一个绿色箭头,点那个也可以

GO的工程结构以及与Intellij IDEA 的配合_第3张图片


多个同名package的处理

那么要是出现如下情况呢

...
└── 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

你可能感兴趣的:(go)