什么是库源码文件
库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话)。
什么是程序实体
即变量、常量、函数、结构体和接口的统称
程序实体的命名规则
程序实体的名字被统称为标识符。标识符可以是任何 Unicode编码可以表示的字母字符、数字以及下划线“_”,但是其首字母不能是数字。
Go语言编写基本规则
代码包声明规则
- 同目录下的源码文件的代码包声明语句要一致
- 源码文件声明的代码包的名称可以与其所在的目录的名称不同。
代码包导入规则
我们通常建议将代码包的名称和目录名称改成相同,避免在调用时混乱。
eg:
我们在lib目录下创建一个go文件,代码包声明为lib5
package lib5
import (
"fmt"
)
func Hello(name string) {
fmt.Printf("Hello, %s!\n", name)
}
我们在q2目录下创建一个入口,导入lib,我们会发现我们只能使用lib5.method而使用lib则通不过编译: ./demo5.go:5:2: imported and not used: "GoSync/src/q2/lib" as lib5 ./demo5.go:16:2: undefined: lib
package main
import (
"GoSync/src/q2/lib"
"flag"
)
var name string
func init() {
flag.StringVar(&name, "name", "everyone", "The greeting object.")
}
func main() {
flag.Parse()
lib5.Hello(name)
}
程序实体的访问权限规则
包级权限规则
Go语言通过名称将程序实体的访问权限分为包级私有和公有,名称的首字母为大写的程序实体才可以被当前包外的代码引用.
模块级权限规则
在 Go 1.5 及后续版本中,我们可以通过创建internal代码包让一些程序实体仅仅能被当前模块中的其他代码引用.
internal代码包中声明的公开程序实体仅能被该代码包的直接父包及其子包中的代码引用。当然,引用前需要先导入这个internal包。对于其他代码包,导入该internal包都是非法的,无法通过编译。