-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Arrays, slices (and strings): The mechanics of 'append' #13
Comments
Arrays, slices (and strings): The mechanics of 'append'Introduction编程语言中最为广泛的一个概念就是array。Arrays似乎看起来很简单,但当将它加入到一门语言中时却会有诸多问题:
....... Arrays数组是GO语言中一个非常重要的组成部分,但是像建筑的基础一样会被可见的其他组件所掩盖。所以在讨论更强大的slice之前,我们得先简短的介绍下array。 ...... 数组有它自己的作用——比如,它们是变换矩阵的很好的表示——但是在GO语言中,它们最主要的作用为slice维护数据存储 Slices: The slice header切片是描述某数组(与切片变量本身分开存储)一个连续部分的数据结构。一个切片不是数组,它描述了数组的一部分。 对某数组进行切片得到slice:
对slice进行slice
reslice 对某个slice进行切片,并把结果赋值给它本身 Passing slices to functions记住在GO里,Slice是一个结构体(数据结构),所以传参时,如果你需要改变实参,那么你得传 *Slice Capacity
Capacity字段记录了所引用数组的大小:它意味着Length所能达到的最大值 Make我们能不能往Slice里不断添加元素,甚至超过它的capacity呢?并不能,但你可以曲线救国。通过在内存分配一个更大容量的数组,然后把原切片的数据复制过去,最后修改SliceHeader数据结构里对应的字段即可。 一种方案是自己new一个数组,然后手动对它创建切片。但使用make更简单,它会自动帮我们完成这两步,all at once。 示例代码:
对于make slice的shorthand形式: Copy在之前,我们double了切片的capacity,然后手动写了个循环逐一把数据复制到新的切片。Go里提供了一个内置函数 copy来帮我们完成这些操作,返回复制元素的个数
并且,copy在两个切片参数重叠时也能正确工作.下面的代码展示了如何使用Copy在一个切片中间插入新的元素:
Append: An example之前我们自己写了个Extend函数用来对Slice进行单个元素的添加,那是有bug的,因为当超出slice capacity的时候会报错。现在我们尝试修复那个bug,利用copy和make:
当发现容量不够时,直接分配一个新的更大的数组,然后利用copy进行切片复制。 Append 也可以用于添加切片,使用...记号,append(slice,slice2...)。 Append: The built-in function之前的Append是我们自己实现的一个例子,接下来要讲的是GO内置的append函数。它不仅仅适用于特定的某一切片类型。 GO的一个缺点是所有的泛型操作都需要通过运行时提供。将来某天,这一点可能会改变吧。 Nil当我们声明一个切片时: var s []int ,等同于 s := []int(nil) 。切片的内部数据结构如下: 因为它指向的数组指针是nil,所以不能向一个nil切片添加元素 |
Go blog里的文章:https://blog.golang.org/slices
下面是部分翻译(实际上更是笔记吧...)
The text was updated successfully, but these errors were encountered: