Identifier
标识符
程序员自己可以决定命名的内容全部称为标识符,如变量、常量、函数、结构体、接口等。
命名方式
- 驼峰命名法:camel case,如
getCurrentTime。 - 帕斯卡命名法:pascal case,如
GetCurrentTime。 - 蛇形命名法:snake came,如
get_current_time。 - 中横线命名法:Kebab case,如
get-current-time。 空格命名法:space case,如。get current time
标识符元素
Go语言在标识符命名时,除以下四种以外的所有字符都不被允许:
- 大写字母。
- 小写字母。
- 数字。
- 下划线。
也就是说,标识符中不能带有$、@、&等字符。
命名规则
- 不能以数字开头,且不运行有空格。
- 严格区分大小写。
- 语义尽可能的清晰明了、简洁。
- 关键字与预定义标识符不能作为标识符。
package main
func main() {
var 1abc int = 123
var $abx int = 123
var my title string = 'hello'
var import string = "hello"
var mytitle string = "abc"
var myTitle string = "cba"
}
关键字
Go语言中共有25个关键字:
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 |
预定义标识符
append | bool | byte | cap | close | complex |
complex64 | complex128 | uint16 | copy | false | float32 |
float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new |
nil | panic | uint64 | print | println | real |
recover | string | true | uint | uint8 | uintptr |
命名规范
项目名
- 中横线隔开。
- 全部小写字母。
包名
- 包名与目录名保持一致。
- 全部小写。
- 不能使用下划线。
- 不能使用标准库的名称。
模块名
- 全部小写。
- 单词使用下划线隔开。
常量
- 全部大写。
- 单词使用下划线隔开。
结构体
遵循命名规则。
接口名
遵循命名规则。
函数与变量
- 遵循命名规则。
- 任何需要在包外暴露被使用的标识符都必须以大写字母开头。
- 任何不需要在包外暴露被使用的标识符都必须以小写字母开头。
变量
数学工具
- 当在计算中,不确定值是什么的时候,用变量进行暂时的替代(抽象)以完成运算,且变量是可变的不确定量。
- 在不同的运算中,变量所表示的最终值不同,所以变量是可变的量。
基本概念
- 表示值的抽象工具。
- 存储计算结果的工具。
变量就是在计算机语言编程时,方便从内存中取值和向内存中存值的工具。
变量声明
Go语言中使用var关键字声明变量,完整的声明格式为:
// 关键字 标识符 变量类型 赋值符号 值
var x int = 1
- 变量声明可以不初始化。
- 变量初始化可以在变量声明之后进行。
- 变量赋值或初始化不是使用变量。
package main
import "fmt"
func main() {
// 声明变量
var x int
// 初始化变量
x = 1
// 使用变量
fmt.Println(x)
}
- 值必须与声明变量时的类型保持一致。
package main
import "fmt"
func main() {
var x int
// cannot use "abc" (untyped string constant) as int value in assignment
x = "abc"
}
- 变量必须先声明后使用。
package main
import "fmt"
func main() {
// undefined a
fmt.Println(a)
}
- 变量声明后必须使用。
package main
import "fmt"
func main() {
// x declared and not used
var x int
x = 1
}
- 同一作用域下不能重复声明同名变量。
package main
func main() {
// int redeclared in this block
var int x
var int x
}
单一声明法
同类型的多个变量可使用单一声明法。
package main
func main() {
var x int = 1
var y int = 2
var z int = 3
// 单一声明
var a, b, c int
a = 1
b = 2
c = 3
// 单一声明与类型推断
var m, n, h = 1, "abc", false
}
批量声明
多个变量可以批量声明。
package main
func main() {
var (
x int = 1
y string = "abc"
z bool = false
)
}
类型推断
Go语言可以根据变量初始值的类型推断其类型。
package main
func main() {
// var x int
var x = 1
// var y string
var y = "abc"
// var z bool
var z = false
}
显式类型声明和类型推断都有各自的使用场景,在保证代码可读性及可维护性的同时按需选择。
短变量语法
在类型推断的基础上省略了声明关键字var。
package main
// 声明语句
var a = 123
func main() {
/*
解析为:
var x int // 声明语句
x = 1 // 赋值语句
*/
x := 1
}
Go语言的函数外部不能使用赋值语句,只能出现声明语句,因此短语法变量不能在函数外部使用。
短变量也可进行批量声明赋值:
package main
func main() {
x, y, z := 1, "abc", false
}
匿名变量
- 匿名变量表示不使用的变量,用
_表示,解析时会被忽略。 - 匿名变量无法访问且一个作用域内可以有多个。
package main
import "fmt"
func main() {
// _ 表示匿名变量
x, _, z := getXYZ()
fmt.Println(x, z)
}
func getXYZ() (int, string, bool) {
return 1, "abc", false
}
常量
数学中的常量
- 恒定不变的自然数或者定义数,如
π、i、∞等。 - 用符号代替比较复杂的数值来表示参与运算的过程。
- 数学中的常量表示的是实用性的值,而不是操作性的值。
编程中的常量
- 沿用了数学中常数的基本特性。
- 常量是被开发者定义的量。
- 常量在初始化后,不可以被修改。
- 常量不可以在同一作用域下重复声明。
总的来说,常量代替值的重复使用,且限制其值的改变。常量在编译时确定其值,运行时不可变其值。
常量定义
Go语言中常量使用const关键声明:
// 关键字 标识符 变量类型 赋值符号 值
const PI float32 = 3.14
- 常量在声明时必须初始化值。
- 常量没有严格要求必须使用,会警告,但不影响编译。
- 常量值不可修改。
package main
func main() {
const PI float32 = 3.1415926
// cannot assign to PI
PI = 3.14
}
类型推断
常量也可根据值的类型进行类型推断。
package main
func main() {
const PI = 3.1415926
}
批量声明
常量也可进行批量声明。
package main
func main() {
const (
NAME = "Tom"
AGE = 12
)
}
单一声明
常量也可进行单一声明。
package main
func main() {
const NAME, AGE = "Tom", 12
}
iota
批量声明常量的时候,第一常量必须要初始化,后续的常量可以不进行初始化,后续没有初始化值的常量,在编译时会赋值为最后一个赋值的常量值。
package main
func main() {
const (
a = 0
b // 0
c // 0
d // 0
e // 0
)
}
iota在Go程序编译时可以修改常量值,默认起始值为0,常量每声明一次, iota迭代一次,与其所在的位置无关。
使用iota相当于使用常量迭代器:
package main
func main() {
const a, b, c, d, e = 1, 2, 3, 4, 5
}
要想达到以上相同的声明效果,可使用iota:
package main
func main() {
const (
a = iota // 0
b // 1
c // 2
d // 3
e // 4
)
const (
x = 100 // 100
y // 100
z = iota // 2
m // 3
n // 4
)
}