Go的值与变量常量
变量
使用var命令声明一个或者多个变量
格式:var identifier type
注意的是,与大部分语言不同的是,类型的位置在后面。这也是go一贯的写法,类型名总在变量名,形参名,函数名的后面
// 类型可以省略,因为如果初始的时候有赋值的话,go会自动推测类型
:= 语句是申明并初始化变量的简写
var f string = "short"
等同f := "short"
可以用小括号将一组要声明的变量包起来:
var (
a int
b string
c bool
d float
e string = "have a nice day ~"
)
而定义时,可以不给赋值,变量会被默认初始化为0, “”, false, 0.000000等默认值
常量
const identifier [type] = value
类型可以省略,因为会自动根据value来推导类型
常量必须被初始化一个值
const (
a int = 100
b // b 会等于 a
c int = 200
d // d 会等于 c
)
iota
iota在const关键字出现时将被重置为0,而后每一行会递增一次,常用来简化定义。
const (
a = iota //
b // 等同于 b = iota
c // c = iota
d // d = iota
)
上面的代码,因为如果一行没有赋值,就等于跟上一行是相同的赋值,所以上面的代码等同于每一行都是赋给了iota的值。然后iota 等于把a赋值为0,然后每一行会递增的得到了1,2,3
const (
a = 2 << iota
b
c
d
)
// 结果
// a = 0
// b = 4
// c = 8
// d = 16
go的枚举
在常量表达式里面,我们可以使用iota来实现类似枚举的递增效果。
type Weekday int
const (
Monday Weekday = iota + 1
Tuesday
Wednesday
Thursday
Friday
)
这样我们就实现了一个类似枚举类型的效果。
可跳过的值
如果我需要的一组值是0,1,2,4,5没有三,那么其实我们可以跳过不想要的值
type Weekday int
const (
Monday Weekday = iota + 1
_
Wednesday
_
Friday
)
比如我们只关心周一周三周五的话,我们可以使用下划线跳过一些值。
类型
go有字符串,整形,浮点型,布尔型等等基本类型
整形
int8,int16,int32,int64,uint8,uint16,uint32,uint64,int,uint,rune,byte,uintptr
后面有位数的代表了bit数量,前面u开头的是无符号数,没有后面的位数与cpu位数有关
rune等同于int32,byte等价于int8
uintptr用来保存一个指针的大小用于底层编程
所有整形的默认值都是0
强类型语言,虽然这些都是整形,但是不能直接相互赋值,需要显示类型转换。(int)
浮点数
float32和float64
复数
complex64和complex128
复数比较时,只有实部虚部完全相等才是等于。
布尔类型
只有true false两种可能的值的类型
使用bool
关键字声明,可以进行逻辑运算,未赋值的默认值为false,格式化输出占位符是%t
注意在进行与操作的时候有与短路:第一个表达式为false时不会计算第二个表达式;同意存在或短路,第一个表达式为真时不会计算后一个表达式;
字符串
有两种表示方式,双引号,反引号,反引号包裹的字符串不支持控制转义字符,会原样输出。
len返回字节数,也可以用[i]访问i字节
+操作可以直接用来衔接字符串
切片,一种类似数组的结构,字符串的一些方法会返回slice,更灵活