积木成楼
首页 / golang

go design (二) slice

2022-01-02 · golang · 约 22 分钟

golang 中如何去设计变长数组

我们在 谈论 slice 的时候到底在 讲什么?

// src/runtime/slice.go 
type slice struct {
	array unsafe.Pointer // 元素指针
	len   int			 // 数据的长度
	cap   int			 // 数据的容量
}

slice 的创建

append 到底做了什么

为什么 nil slice 可以直接 append

sliceslice 指针有什么区别

 func main() {
 	s := []int{1, 1, 1}
 	f(s)
 	fmt.Println(s)
 }
 
 func f(s []int) {
 	// i只是一个副本,不能改变s中元素的值
 	for _, i := range s {
 	   i++
 	}
 
 	// 这个 改变了底层数组 会产生影响
 	for i := range s {
 		s[i] += 1
 	}
 	
 	// append 对底层数组进行了迁移 也不会应用到 原来的数组
 	s = append(s,20)
 	s[1] = 5
 	fmt.Println(s)
 }
 func main() {
 	a := make([]int, 2, 3)
 	b := a
 	b = append(b, 1)
 	b[0] = 19
 	fmt.Println(a, cap(a), len(a)) // [19 0] 3 2
 	fmt.Println(b, cap(b), len(b)) // [19 0 1] 3 3
 }
 
 func main() {
 	a := make([]int, 2, 3)
 	b := a
 	b = append(b, 1, 2)
 	b[0] = 19
 	fmt.Println(a, cap(a), len(a)) // [0 0]      3 2
 	fmt.Println(b, cap(b), len(b)) // [19 0 1 2] 6 4
 }

copy 函数的小坑

← 返回文章列表