5.1 字符串string

字符串是不可变字符序列

默认值为空串,而不是空指针。

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
s := 'Hello, world'

// byte
for i := 0; i < len(s); i++ {
println("%d: [%c]\n", i, s[i]);
}

// rune
for i, c := range s {
println("%d ,[%c]\n", i, c);
}
}

5.2 数组

5.2.1 数组的初始化

1
2
3
4
5
6
7
8
9
10
11
func main() {
var a [4]int // 元素自动初始成0
b := [4]int{2, 5} // 剩余元素自动初始化成0
c := [4]int{5, 3:10}; // 指定索引位置
d := [...]int{1, 2, 3} // 编译器确定数组长度
// 在定义多维数组时, 仅第一维允许使用...
b := [...][2]int {
{10, 20},
{30 ,40},
}
}

5.2.2 指针

1
2
3
4
5
func main() {
x, y := 10 ,20
a := [...]*int{&x, &y} // 指针数组
p = &a // 数组指针
}

5.2.3 复制

与C数组变量隐式作为指针使用不同, Go数组是值类型,赋值和传参工作都会复制整个数组数据

5.3 切片

slice本身并非动态数组或数组指针。它内部通过指针引用底层数组,设定相关属性将数据读写操作限定在制定区域内。

1
2
3
4
5
6
// 数据结构
type slice strcut {
arrary unsafe.Pointer
len int // 限定可读的写元素数量
cap int // 切片所引用数组片段的真实长度
}

切片本身是一个只读对象, 其工作机制类似数组指针的一种包装

5.3.1 创建切片对象

1
2
3
4
func main() {
s1 := make([]int, 3, 5) //指定len, cap, 底层数组初始化成零值
s2 := make([int], 3) // 省略cap, 和len相等
}

切片是包装过的数组对象,用来代替数组减少值传递带来的开销

5.4 字典

基本操作

1
2
3
4
5
6
7
8
9
10
func main() {
m := map[string]int {
"a": 1,
"b": 2,
}
// 判断key是否存在
if v, ok := m["d"]; ok {
println(v)
} // 访问不存在的键值, 默认返回零值
}