在HelloWorld之前

  1. 所有的 Go 代码都是以包的形式组织起来的。Go 中的包就是目录或文件夹里面包括一个或者多个以 .go 结尾的文件。

  2. 所有的 Go 代码都是放在包里的,且只能是通过包来进行访问。

  3. 程序从 main 包开始运行。

一个Hello world示例:

package main

import "fmt"

func main(){
    fmt.Println("Hello new Gopher~")
}

命名规范

项目命名

其实对于项目命名没有强制的要求,通常都是使用小写字母,名词之间用英文破折号-隔开

例如: v2ray-core

文件名

由于文件跟包无任何关系, 而又避免windows大小写的问题,所以推荐的命名规范如下: 文件名应一律使用小写, 不同单词之间用下划线分割, 命名应尽可能地见名知意

但是:整个应用或包的主入口文件应当是 main.go 或与应用名称简写相同。例如:gogs 的主入口文件名为 gogs.go

包的命名

包的名字应尽量简短但要足够清晰的表明包的含义/作用,只用小写,不要用下划线式,也不要用驼峰式。

例如:timelisthttp

不要使用例如:commonutil 这样泛泛的命名

包的导入/导出

包的导入

使用import关键字进行导包,导入没有调用的包会导致出错(简单说就是你导了这个包就得用)

你可以一个个的导入

import "fmt"
import "math"

也能多个一起导入

import (
	"fmt"
	"math"
)

有时为将导入的包进行分类,使代码结构更加清晰还可以这么做:

import (
	"fmt"
	"math"
)

import (
	"time"
)

包的导出

在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的(即外部可访问的)。

在导入一个包时,你只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。

package main

import (
	"fmt"
	"math"
)

func main() {
    //fmt.Println(math.pi) 此处的pi是首字母小写,因此它是外部不可访问的
	fmt.Println(math.Pi)
}

包与文件夹的关系

包名和文件夹名的关系

简单说,包名和文件夹名没什么关系(与java不同)

go在执行导入的时候,若不手动定义包名,则从导入路径的源码文件中的 package 行获取包名

尽管包名可以和文件夹名不一样,一个是导入路径,一个是包名

不建议这么做,这样容易造成调用这个包的人,无法快速知道这个包的名称是什么(也就是程序知道它在调什么,而操作者可能不知道,所以尽量做到包名和文件夹名的一致)

包与文件夹

  1. 一个包不可以存在于两个文件夹下,两个文件夹下的包是两个不同包(一个包所有的文件,必须位于同一个目录下)
  2. 若从不同的文件夹下导入了名称相同的包,会产生 重复声明的错误,此时需要使用别名加以区分

简单说就是

  1. import 导入的参数是路径,而非包名。
  2. 尽管习惯将包名和目录名保证一致,但这不是强制规定;
  3. 在代码中引用包成员时,使用包名而非目录名;
  4. 同一目录下,所有源文件必须使用相同的包名称(因为导入时使用绝对路径,所以在搜索路径下,包必须有唯一路径,但无须是唯一名字);
  5. 至于文件名,更没啥限制(扩展名为 `.go` ,注意命名规范即可);

参考内容

  1. [the go blog](https://blog.golang.org/package-names)
  2. [Go语言中包的风格指南](https://studygolang.com/articles/11823)
  3. [知乎-go语言中package和文件夹的关系](https://www.zhihu.com/question/60426831)

Q.E.D.


此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。