非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第8章 包管理
- 8.8 Go语言命名规范
- 8.8.1 驼峰式命名法
- 8.8.2 导出标识符
- 8.9 小结
- 8.10 知识拓展
- 8.10.1 标准包简介
第8章 包管理
8.8 Go语言命名规范
对于Go语言命名规范,每一家公司根据自己的实际情况可能都有不同。
一般而言,为了增强代码的可读性,使不同开发者编写的代码更易于理解,对于命名的规范会达成某种共识,如驼峰式命名法和package命名规范。
另外,我们也可以多阅读Go语言标准库源码,因为标准库的代码可以说是我们写代码参考的标杆。
8.8.1 驼峰式命名法
Go语言中,我们推荐使用驼峰式命名法来对各类标识符(变量、常量和结构体等)和文件进行命名。
驼峰式命名法有两种格式:小驼峰命名法和大驼峰命名法。
【1】小驼峰命名法
第一个单词以小写字母开始,其他单词的首字母则需要大写:
var sumNum int
var firstName string
var isValid bool
var printValue func()
【2】大驼峰命名法
每一个单词的首字母都采用大写:
var SumNum int
var FirstName string
var IsValid bool
var PrintValue func()
需要注意的是,在进行测试用例的编写时,文件的命名不遵循驼峰式命名法,而是以xx_test.go的格式进行命名。
测试用例的函数以大驼峰命名法进行命名且以“Test”开头。
如Go语言fmt包中的某个测试文件scan_test.go中的TestScan函数:
func TestScan(t *testing.T) {
for _, r := range readers {
t.Run(r.name, func(t *testing.T) {
testScan(t, r.f, Fscan)
})
}
}
8.8.2 导出标识符
Go语言中标识符根据首字母的大小写来确定可以访问的权限。
- 如果首字母大写,则表示可以被其他包中的代码访问(可被导出);
- 如果首字母小写,则表示该标识符只能在本包中使用(不可导出)。
如果你学习过其他编程语言,那么你可以这样理解:首字母大写的标识符是公有的,而首字母小写的标识符是私有的。【懂】
例如,下方的目录结构中,main文件夹下有main.go文件,pkg文件夹下有pkg.go文件:
pkg.go属于pkg包,代码如下,其中只有SumNum变量是可导出的:
[ 动手写 8.8.1]
package pkg
import "fmt"
var SumNum = 1
var firstName = "Peter"
var isValid = false
func printValue() {
fmt.Println("Go 牛逼!")
}
main.go属于main包,代码如下,调用并打印了pkg包下的SumNum变量:
可以看到,其他压根儿都没提示
package main
import (
"GolangStudy/第8章包管理/Go语言命名规范/pkg"
"fmt"
)
func main() {
fmt.Println("pkg包下的SumNum 变量值为: ", pkg.SumNum)
}
运行结果
当然路径不能有中文,调整一下
package main
import (
. "GolangStudy/chapter8/Go/pkg"
"fmt"
)
func main() {
fmt.Println("pkg包下的SumNum 变量值为: ", SumNum)
}
对于pkg包中的firstName、isValid和printValue函数,由于是不可导出的,所以在其他包中无法访问。
8.9 小结
- GOPATH必须要设置,但并不是固定不变的。GOPATH的目的是为了告知Go需要代码的时候去哪里查找。
- package是Go语言最基本的分发单位和工程管理中依赖关系的体现。
- 每个Go语言源代码文件开头都拥有一个package声明,表示该Go语言代码所属的package。
- 要生成Go语言可执行程序,必须建立一个名为main的package,并且在该package中必须包含一个名为main()的函数。
- import关键字导入的是package路径,而在源文件中使用package时,才需要package名。经常可见的import的目录名和源文件中使用的package名可以不一致。
- 不得导入源代码文件中没有用到的package,否则Go语言编译器会报编译错误。
- 解决包依赖问题可以使用go mod命令或者第三方工具govendor。
8.10 知识拓展
8.10.1 标准包简介
-
unsafe
unsafe包含了一些打破Go语言“类型安全”的命令,一般的程序不会使用它,可用于C/C++ 程序的调用中。
-
os-os/exec-syscall
- os:提供给我们一个平台无关性的操作系统功能接口,采用类Unix设计,隐藏了不同操作系统间的差异,让不同的文件系统和操作系统对象表现一致。
- os/exec:提供给我们运行外部操作系统命令和程序的方式。
- syscall:底层的外部包,提供了操作系统底层调用的基本接口。
-
archive/tar和/zip-compress
压缩(解压缩)文件功能。
-
fmt-io-bufio-path/filepath-flag
- fmt:提供了格式化输入输出功能。
- io:提供了基本输入输出功能,大多数是围绕系统功能的封装。
- bufio:缓冲输入输出功能的封装。
- path/filepath:用来操作在当前系统中的目标文件名路径。
- flag:对命令行参数的操作。
-
strings-strconv-unicode-regexp-bytes
- strings:提供对字符串的操作。
- strconv:提供将字符串转换为基础类型的功能。
- unicode:为unicode型的字符串提供特殊的功能。
- regexp:正则表达式功能。
- bytes:提供对字符型分片的操作。
-
math-math/cmath-math/rand-sort-math/big
- math:基本的数学函数。
- math/cmath:对复数的操作。
- math/rand:伪随机数生成。
- sort:为数组排序和自定义集合。
- math/big:大数的实现和计算。
-
container-/list-ring-heap
实现对集合的操作。
- list:双链表。
- ring:环形链表。
-
time-log
- time:日期和时间的基本操作。
- log:记录程序运行时产生的日志。
-
encoding/Json-encoding/xml-text/template
- encoding/Json:读取并解码和写入并编码JSON数据。
- encoding/xml:简单的XML 1.0解析器。
- text/template:生成像HTML一样的数据与文本混合的数据驱动模板。
-
net-net/http-html
- net:网络数据的基本操作。
- http:提供了一个可扩展的HTTP服务器和客户端,解析HTTP请求和回复。
- html:HTML5解析器。
-
runtime
Go程序运行时的交互操作,例如垃圾回收和协程创建。
-
reflect
实现通过程序运行时反射,让程序操作任意类型的变量。