在HelloWorld之前
-
所有的 Go 代码都是以包的形式组织起来的。Go 中的包就是目录或文件夹里面包括一个或者多个以
.go
结尾的文件。 -
所有的 Go 代码都是放在包里的,且只能是通过包来进行访问。
-
程序从
main
包开始运行。
一个Hello world示例:
package main
import "fmt"
func main(){
fmt.Println("Hello new Gopher~")
}
命名规范
项目命名
其实对于项目命名没有强制的要求,通常都是使用小写字母,名词之间用英文破折号-
隔开
例如: v2ray-core
文件名
由于文件跟包无任何关系, 而又避免windows大小写的问题,所以推荐的命名规范如下: 文件名应一律使用小写, 不同单词之间用下划线分割, 命名应尽可能地见名知意
但是:整个应用或包的主入口文件应当是 main.go
或与应用名称简写相同。例如:gogs
的主入口文件名为 gogs.go
。
包的命名
包的名字应尽量简短但要足够清晰的表明包的含义/作用,只用小写,不要用下划线式,也不要用驼峰式。
例如:time
、list
、http
不要使用例如:common
、util
这样泛泛的命名
包的导入/导出
包的导入
使用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.