8

Go项目的目录结构

 3 years ago
source link: http://blog.studygolang.com/2012/12/go%e9%a1%b9%e7%9b%ae%e7%9a%84%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

项目目录结构如何组织,一般语言都是没有规定。但Go语言这方面做了规定,这样可以保持一致性

1、一般的,一个Go项目在GOPATH下,会有如下三个目录:

1|--bin
2|--pkg
3|--src

其中,bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。
对于pkg目录,曾经有人问:我把Go中的包放入pkg下面,怎么不行啊?他直接把Go包的源文件放入了pkg中。这显然是不对的。pkg中的文件是Go编译生成的,而不是手动放进去的。(一般文件后缀.a)
对于src目录,存放源文件,Go中源文件以包(package)的形式组织。通常,新建一个包就在src目录中新建一个文件夹。

2、举例说明

比如:我新建一个项目,test,开始的目录结构如下:

1test--|--src

为了编译方便,我在其中增加了一个install文件,目录结构:

1test/
2|-- install
3`-- src

其中install的内容如下:(linux下)

1#!/usr/bin/env bash
2 
3if [ ! -f install ]; then
4echo 'install must be run within its container folder' 1>&2
5exit 1
6fi
7 
8CURDIR=`pwd`
9OLDGOPATH="$GOPATH"
10export GOPATH="$CURDIR"
11 
12gofmt -w src
13 
14go install test
15 
16export GOPATH="$OLDGOPATH"
17 
18echo 'finished'

之所以加上这个install,是不用配置GOPATH(避免新增一个GO项目就要往GOPATH中增加一个路径)

接下来,增加一个包:config和一个main程序。目录结构如下:

1test
2|-- install
3`-- src
4|-- config
5|   `-- config.go
6`-- test
7`-- main.go

注意,config.go中的package名称必须最好和目录config一致,而文件名可以随便。main.go表示main包,文件名建议为main.go。(注:不一致时,生成的.a文件名和目录名一致,这样,在import 时,应该是目录名,而引用包时,需要包名。例如:目录为myconfig,包名为config,则生产的静态包文件是:myconfig.a,引用该包:import “myconfig”,使用包中成员:config.LoadConfig()

config.go和main.go的代码如下:
config.go代码

1package config
2 
3func LoadConfig() {
4 
5}

main.go代码

1package main
2 
3import (
4"config"
5"fmt"
6)
7 
8func main() {
9config.LoadConfig()
10fmt.Println("Hello, GO!")
11}

接下来,在项目根目录执行./install

这时候的目录结构为:

1test
2|-- bin
3|   `-- test
4|-- install
5|-- pkg
6|   `-- linux_amd64
7|       `-- config.a
8`-- src
9|-- config
10|   `-- config.go
11`-- test
12`-- main.go
13(linux_amd64表示我使用的操作系统和架构,你的可能不一样)

其中config.a是包config编译后生成的;bin/test是生成的二进制文件

这个时候可以执行:bin/test了。会输出:Hello, GO!

3、补充说明

1)包可以多层目录,比如:net/http包,表示源文件在src/net/http目录下面,不过源文件中的包名是最后一个目录的名字,如http
而在import包时,必须完整的路径,如:import “net/http”

2)有时候会见到local import(不建议使用),语法类似这样:

import “./config”

当代码中有这样的语句时,很多时候都会见到类似这样的错误:local import “./config” in non-local package

我所了解的这种导入方式的使用是:当写一个简单的测试脚本,想要使用go run命令时,可以使用这种导入方式。
比如上面的例子,把test/main.go移到src目录中,test目录删除,修改main.go中的import “config”为import “./config”,然后可以在src目录下执行:go run main.go

可见,local import不依赖于GOPATH

4、Windows下的install.bat

1@echo off
2 
3setlocal
4 
5if exist install.bat goto ok
6echo install.bat must be run from its folder
7goto end
8 
9: ok
10 
11set OLDGOPATH=%GOPATH%
12set GOPATH=%~dp0
13 
14gofmt -w src
15 
16go install test
17 
18:end
19echo finished

注,冒号和ok之间不应该有空格,但是放在一起总是会被wordpress转成一个表情。汗……

5、更新日志

1)2012-12-05 发布
2)2013-04-13 修正:目录名可以和包名不同,但建议一致;将make文件名改为install

欢迎关注我的公众号:

polarisxu-qrcode-soso-s.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK