一、命名
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大小写字母是敏感的。
下面25个内置关键字和37个预定义的名字是不可以用于自定义名字的。预定义和关键字的区别在于,预定义的名字你是可以在定义中重新使用他们的,但是尽量少用避免造成歧义。
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
内建常量: true false iota nil
内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
内建函数: make len cap new append copy close delete
complex real imag
panic recover
对于名字,还有以下特点需要注意:
- 名字的作用域范围,可以参考 1.6 代码块和作用域 的内容
- 大写字母开头决定它的可导出性
- 包本身的名字一般总是用小写字母
- 名字的长度没有逻辑限制,但是Go语言的风格是尽量使用短小的名字,对于局部变量尤其是这样。一般的,名字越短,作用域越小,反之则越大
- 习惯上,Go语言程序员推荐使用 驼峰式 命名
- 像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml
二、声明
声明语句定义了程序的各种实体对象以及部分或全部的属性。当一个变量被声明之后,系统自动赋予它该类型的零值(如bool的零值是false, 整数的零值是0等)。Go语言主要有四种类型的声明语句:
- var:变量的声明
- const:常量的声明
- type:结构体的声明
- func:函数的声明
我们用下面的代码感受下各种“声明”的使用。
// Boiling prints the boiling point of water.
package main
import "fmt"
const boilingF = 212.0
func main() {
var f = boilingF
var c = (f - 32) * 5 / 9
fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
// Output:
// boiling point = 212°F or 100°C
}
对于上面示例代码中的“声明”,解析如下:
- package 包的声明语句,说明该 1.7 源文件 属于哪个包
- 然后是包级别的变量、常量和函数的声明语句,它们之间的顺序无关紧要
- boilingF这个常量是包级别的作用域,而变量f和c则是函数级别的作用域
- 函数的声明由一个函数名字、参数列表(由函数的调用者提供参数变量的具体值)、一个可选的返回值列表和包含函数定义的函数体组成。无需返回值的函数,返回值列表可以省略
变量声明的方式的“语法糖”
上面我们讲到的变量声明语句是var name string。但还有一种便利方式是:短变量声明。
name := "zhengkai"
这里利用了 Go 语言自身的类型推断,而省去了对该变量的类型的声明。简单地说,类型推断是一种编程语言在编译期自动解释表达式类型的能力。Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。
常见的声明举例:
//基础类型
var a int | var a , b string | var c byte | var d bool |
a := 10 | b := "123456" | c := 'a' | d := true
//数组
var array [10]int
q := [...]int{1, 2, 3}
//切片
var name []Type
a := []int{1, 2, 3}
make([]Type, size, cap)
//map
var mapList map[int]string
mapList := map[int]string{1:"a", 2:"b"}
mapList := make(map[int]string)
//sync.Map 引入包后直接声明
import "sync"
var scene sync.Map
//list
import "container/list"
var listA list.List
listA := list.New()
//chan
var chanA = chan int
chanA := make(chan int)
chanA = make(chan int)
最后,关于声明和初始化,有些地方需要特殊强调一下:
make一定发生了内存分配。map直接声明后不能直接操作,下标因为此时变量指向空指针,需要make之后才能操作。通道是引用类型,声明后值为nil,所以也需要make后才可使用。
好了,关于命名和声明相关的知识点就整理到这里,接下来继续学习 变量 吧!