变量
-
语言变量名满足(标识符规则)由字母、数字、下划线组成,其中首个字符不能为数字
-
使用 var 关键字声明,同作用域内不能重复声明
-
变量初始化零值表
类型 类型 零值 bool 布尔类型 false int 整数 0 float 浮点 0.0 string 字符串 “” pointer, function, interface, slice, channel, map 引用类型 nil array, struct 聚合类型 嵌套零值 time.Time 时间 0001-01-01 00:00:00 +0000 UTC https://golang.google.cn/ref/spec#The_zero_value
作用域
- 函数内定义的变量称为局部变量
- 函数外定义的变量称为全局变量
- 函数定义中的变量称为形式参数
//全局变量
//函数外,小写本包,大写跨包,不能使用省略var的形式
//Global := 1 出错:Global unexpected
var Global = 1
//局部变量 如果和全局变量同名,优先使用全局变量
//函数内、for/if中
func test() (int,int) {
a:=0
b:=0
return a+b,a-b
}
//形式参数
//fmt.Println(a,b) a,b在sumDiffer函数内,是局部变量,不能访问
fmt.Println("author time:",author,time)
声明
// var 变量名1[,变量名2...] 类型
var num int
var num1,num2 int
//批量 常用于全局变量声明
/*
var (
变量1 = value1
变量2 = value2
)
*/
var (
author = "lady_killer9"
time = "now"
)
初始化
// var 变量名1[,变量名2...] [类型] = value1[,value2...]
var num3 int8 = 1
var num4,num5 int = 1,2
类型推导
// var 变量名1[,变量名2...] = value1[,value2...]
var num3 = 1 // 推导 num3 int
var string1 = "aaa" //推导 string1 string
声明初始化
// 变量名1[,变量名2...] := value1[,value2...]
// := 必须在函数体内部
f1 := 5.0
匿名变量(不占空间,不分配内存)
// _ 表示匿名变量 编译器忽略
_,a := 1,2
赋值
num1 = 1 // 赋值
num2 = 2
num1,num2 = num2,num1 // 交换
_,num2 = 1,2 // 丢弃
常量
-
使用关键字const,声明时必须赋值
-
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
-
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
// const 变量名 [type] = value
const Pi = 3.1415926
// 多个常量
/*
const (
变量名1 [type] = value
变量名2 [[type] = value]
....
)
*/
const (
pi = 3.1415
e = 2.7182
)
缺省
//声明多个变量时 省略表示和上面值一样
const(
a = 1
b //b = 1
c //c = 1
)
iota计数器
-
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),
-
const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)
const (
Sun = iota //0
Mon //1
Tue //2
Wed //3
Thur //4
Fri //5
Sat //6
)
const (
a = iota //0
b //1
c //2
d = "ha" //独立值 "ha",iota += 1 = 3
e //"ha" iota += 1 = 4
f = 100 //独立值 100 iota +=1 = 5
g //100 iota +=1 = 6
h = iota //7,恢复计数
i //8
)
//<<n==*(2^n)
const (
i=1<<iota //1*1
j=3<<iota //3*2
k //3*4
l //3*8
)