基础类型
整型
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64
uintptr:容纳指针
浮点数
float32:6个十进制的精度
float64:15个十进制数的精度
复数
complex64、complex128对应float32和float64两种浮点数精度
布尔型
true和false
字符串
不可改变的字节序列
s[i]返回第i字节的字节值,越界会出现异常
s[i:j]:以s中[i:j)生成的新字符串,i不写就为0,j不写就为len(s)
+可以连接两个字符串构造一个新字符串
字符串编码见书
字符串、字符、字节,字符串和数值转换见书
常量
使用const声明
const pi = 3.13159
iota常量生成器
type Weekday int
// 周日为0,周一为1...,为每一天定义一个常量
// iota换成1 << iota,就是1bit指定一个名字
const(
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
复合数据类型
数组和结构体是固定内存大小的数据结构,slice和map是动态增长的数据结构
数组
声明
var a [3]int //3个整数的数组
var q [3]int = [3]int{1, 2, 3} //数组初始化为123
q := [...]int{1, 2, 3} // 省略号表示根据初始值的个数计算数组长度
r := [...]int{99: -1} // 100个元素的数组,最后一个元素为-1,其他元素为0
dp := make([]int, n + 1)
遍历
for i, j := range arr{
}
slice
slice代表变长的序列,语法和数组很像,只是没有固定长度
声明
months := [...]string{1: "January", /*...*/, 12: "December"} // 跳过索引0
Q2 := months[4:7]
summer := months[6:9]
使用
// 反转slice函数
func reverse(s []int) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
append
向slice追加元素
内存技巧
见书
Map
初始化
ages := make(map[string]int) //使用make函数创建map,map写为map[K]V形式
// 指定初值
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
访问
通过map[key]访问,查找失败返回value类型零值
不能对map的元素进行取址操作
ages["alice"] = 32
删除
// 使用内置的delete函数
delete(ages, "alice")
遍历
map中的迭代顺序不确定,不同的哈希函数实现可能导致不同的遍历顺序。实践中,遍历的顺序是随机的
for name, age := range ages{
}
set
go中没有提供set,可以将map的value忽略作为set使用
结构体
声明
type Employee struct{
ID int
Name string
Address string
}
var dilbert Employee
访问
通过.操作符访问,比如dilbert.Name,可以直接对每个成员赋值或者取地址。(结构体指针访问成员也是.操作符)