变量

Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存

声明

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

Go 语言中关键字和保留字都不能用作变量名。

Go 语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。

并且 Go 语言的变量声明后必须使用,否则会编译错误

声明变量的一般形式是使用 var 关键字

var 是声明变量的关键字,name 是变量名,type 是变量的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 标准格式 
var 变量名 数据类型
// 声明并赋值
var 变量名 变量类型 = 变量值
// 一次声明多个变量
var 变量1,变量2 类型
// 一次声明多个变量并赋值
var 变量1,变量2=值1,值2
//批量格式 变量组,只适用于全局变量声明
var (
a int
b string
c []float32
d func() bool
e struct { x int }
)
//批量声明并赋值
var (
a int = 20
b string = "张三"
c []float32
d func() bool
e struct { x int }
)
//短变量声明法 声明并赋值
名字 := 表达式
//批量
变量1,变量2,变量n := 值1,值2,值n

有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化,这种行为称为==类型推导==

短变量声明法,==短变量只能用于声明局部变量,不能用于全局变量的声明==

初始化

Go 语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值

  • 整型和浮点型变量的默认值为 0。
  • 字符串变量的默认值为空字符串。
  • 布尔型变量默认为 false。
  • 切片、函数、指针变量的默认为 nil

匿名变量

在使用多重赋值时,如果想要忽略某个值,可以使用 匿名变量(anonymous variable)。 匿名变量用一个下划线 _ 表示

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明

1
2
3
4
5
6
7
8
func getInfo() (int, string) { 
return 10, "张三"
}

func main() {
_,username := getInfo()
fmt.Println(username)
}

注意事项:

1、函数外的每个语句都必须以关键字开始(var、const、func 等)
2、:不能使用在函数外。
3、_多用于占位,表示忽略值

默认值

当声明了一个变量 , 但却还并没有赋值时 , golang 中会自动给变量赋值一个默认零值。这是每种类型对应的零值

数据类型 默认值
bool FALSE
numbers 0
string “”
pointers nil
slices nil
maps nil
channels nil
functions nil
interfaces nil

命名规则

1. 变量名称必须由数字、字母、下划线组成。
2. 标识符开头不能是数字
3. 标识符不能是保留字和关键字。
4. 变量的名字是区分大小写的。如: age 和 Age 是不同的变量。在实际的运用中,也建议,不要用一个单词大小写区分两个变量。
5. 标识符(变量名称)一定要见名思意 :变量名称建议用名词,方法名称建议用动词
6. 变量命名一般采用驼峰式,当遇到特有名词(缩写或简称,如 DNS)的时候,特有名词根据是否私有全部大写或小写。

常量

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。

常量的声明和变量声明非常类似,只是把 var 换成了 const,常量在定义的时候必须赋值

1
2
3
4
5
6
7
//声明赋值 
const pi = 3.1415
//批量
const(
p = 3.1415
e = "hello"
)

const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同

const 常量结合 iota 的使用 (了解)

  • itoa 是 golang 语言的常量计数器,只能在常量的表达式中使用。

    • iota 在 const 关键字出现时将被重置为 0 (const 内部的第一行之前)
  • const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)

使用说明

iota 只能在常量的表达式中使用

1
fmt.Println(iota) 编译错误: undefined: iota

每次 const 让 出现时,都会让 iota 初始化为 0. 【自增长】

1
const a = iota // a=0 const ( b = iota //b=0 c //c=1 )

const iota 使用 _ 跳过某些值

1
2
3
4
5
6
const ( 
n1 = iota //0
n2 //1
_
n4 //3
)

iota 声明中间插队

1
2
3
4
5
6
7
const ( 
n1 = iota //0
n2 = 100 //100
n3 = iota //2
n4 //3
)
const n5 = iota //0

多个 iota 定义在一行

1
2
3
4
5
const ( 
a, b = iota + 1,iota + 2 //1,2
c, d //2,3
e, f //3,4
)

代码风格

  1. 代码每一行结束后不用写分号( ;)

  2. 运算符左右建议各加一个空格

    var username string = "itying"

  3. Go 语言程序员推荐使用驼峰式命名

    当名字有几个单词组成的时优先使用大小写分隔

  4. 强制的代码风格

    左括号必须紧接着语句不换行,这个特性刚开始会使开发者不习惯,但随着对 Go 语言的不断熟悉,就会发现风格统一让大家在阅读代码时把注意力集中到了解决问题上,而不是代码风格上

  5. go fmt 主要用于格式化文档,让所有人的代码风格保持一致

    go fmt main.go main.go