变量
- 有符号整型
int
, 至少32位,取决于cpuint8
, 8位int16
, 16位int32
, 32位int64
, 64位
- 无符号整型
uint
, 至少32位,取决于cpuuint8
, 8位uint16
, 16位uint32
, 32位uint64
, 64位
- 浮点型
float32
, 32位浮点float64
, 64位浮点
- 复数类型
complex
, 默认实部和虚部都是float64
的浮点数,即默认是complex128
complex64
, 实部和虚部都是float32
的浮点数complex128
, 实部和虚部都是float64
的浮点数imag
, 虚部real
, 实部
- 布尔类型
bool
, 布尔值,必须赋值为true
或false
true
false
- 字符类型
byte
, 单个字符,utf-8编码,长度为8位string
, 字符串rune
, unicode编码,长度为32位
- 指针
uintptr
, 指针,长度取决于cpu
变量和常量
go语言使用var声明变量,使用const声明常量
var i int = 10 //声明一个int型变量i,并赋值
var j = 10 //编译器会进行自动推导
k := 5 // :=符号等同于var k = ,表示声明一个新的变量,同样编译器会自动推导类型
const m int = 10 //声明一个常量m
const n = 10 //声明一个常量n
go语言对未初始化的变量会默认赋值为0,字符串赋值为空。go语言的自动推导会将整数推导为int
,浮点数推导为float64
,复数推导为complex128
,字符串推导为string
。
同时go还提供了一个有趣的功能让我们更加方便的声明多个常量:iota
。iota
的默认为0,每出现一个会自动加一,直到遇到下一个const
会重置为0.
const (
RED = 1 << iota //1 << 0 == 1
BLUE //相当于BLUE = 1 << iota, 1 << 1 == 2
GREEN //相当于GREEN = 1 << iota,1 << 2 == 4
)
const (
SUCCESS = iota //重置为0,0
FAILED //1
)
字符串
go语言中字符串使用双引号"
或者单引号'
来创建,使用的是utf-8
的编码方式,并且支持+、==、>、<、!=、>=、<=等操作,这些操作会一个字节一个字节的比较字符串。
数组和切片
数组
go语言的数组是一个定长的相同类型的序列,和c语言的数组类似。可以使用[]
来索引数组,下标从0开始。
var a [3]int //创建一个长度为3的int型数组,内部会初始化为0
var b [4]int{1, 2, 3, 4} //创建一个长度为4的int型数组,同时进行初始化
var c [...]int{1, 2, 3} //创建数组,并初始化,长度由初始化内容决定
可以使用len()
计算数组的长度。
切片
由于在go语言中数组是按照值进行传递的,也就是说如果将数组作为参数进行传递,那么会拷贝数组的全部内容,这样对于长数组会造成巨大的性能损失。因此go又引入了切片,切片是按引用进行传递的,是一个可变长的数组,因此切片不仅有长度(len()
函数获取),表示切片内当前保存的元素个数,还有容量(cap()
函数获取),表示切片当前能保存的最大元素个数。如果容量不足,切片会重新申请一块更大的内存保存数据。
var a = make([]int, len, cap) //创建一个int类型,长度为len,容量为cap的切片,cap>len
var b = make([]int, len) //创建一个int类型,长度为len的切片,不指定容量
var c []int{} //创建int型切片
var d []int{1, 2, 3, 4} //创建int型切片,并进行初始化
映射
go语言的映射(map
)是一种内置结构,保存键值对的集合,唯一的限制是映射的键类型必须支持==
和!=
操作。
var a = make(map[int]string, cap) //创建一个int-->string的映射,初始化容量为cap
var b = make(map[string]int)
var c map[int]string
var d map[int]string{1:'1', 2:'2'}
映射可以使用[]
进行访问
m[k] = v //将值v赋给m的键k,如果k已经有对应的值,会覆盖
v := m[k] //创建一个变量,并将m的键k对应的值赋值给v,如果键k不存在,那么会传给v一个零值
v, found := m[k] //将键k对应的值传给v,如果键存在found为true,否则为false
Delete(m, k)
会从m从删除键k,如果k不存在,什么都不会做
len()
函数也可以计算映射的长度
变量持有类型
对于go语言,除了通道、函数、方法、映射和切片外,其他的内置类型都是按照值进行传递的。