go语言笔记——append底层实现和Cpp vector无异,只是有返回值,double后返回了新的vector地址而已
2017-05-16 17:28
926 查看
切片的复制与追加
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。示例 7.12 copy_append_slice.go
package main import "fmt" func main() { sl_from := []int{1, 2, 3} sl_to := make([]int, 10) n := copy(sl_to, sl_from) fmt.Println(sl_to) fmt.Printf("Copied %d elements\n", n) // n == 3 sl3 := []int{1, 2, 3} sl3 = append(sl3, 4, 5, 6) fmt.Println(sl3) }
func append(s[]T, x ...T) []T其中 append 方法将 0 个或多个具有相同类型 s 的元素追加到切片后面并且返回新的切片;追加的元素必须和原切片的元素同类型。如果 s 的容量不足以存储新增元素,append 会分配新的切片来保证已有切片元素和新增元素的存储。因此,返回的切片可能已经指向一个不同的相关数组了。append 方法总是返回成功,除非系统内存耗尽了。
如果你想将切片 y 追加到切片 x 后面,只要将第二个参数扩展成一个列表即可:
x = append(x, y...)。
注意: append 在大多数情况下很好用,但是如果你想完全掌控整个追加过程,你可以实现一个这样的 AppendByte 方法:
func AppendByte(slice []byte, data ...byte) []byte { m := len(slice) n := m + len(data) if n > cap(slice) { // if necessary, reallocate // allocate double what's needed, for future growth. newSlice := make([]byte, (n+1)*2) copy(newSlice, slice) slice = newSlice } slice = slice[0:n] copy(slice[m:n], data) return slice } 摘自:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.5.md
相关文章推荐
- Go语言学习记录之一(返回指针与返回值的区别)
- 49.笔记go语言——实现斐波那契
- go语言笔记——defer作用DB资源等free或实现调试
- go语言学习笔记之冒泡排序的实现
- go语言笔记——append是内置的函数!!!new是一个函数!!!调试可以使用闭包,本质上是print调试,尼玛!
- C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
- Go学习笔记】go语言开发环境搭建&go实现的hello world!
- LDD3学习笔记设备模型之底层实现(kobject,kset) 收藏
- struts2学习笔记之转换器实现语言切换
- Struts 2 拦截器底层实现原理 学习笔记
- Go语言日趋成熟 运行速度接近C语言实现程序
- 汇编语言学习笔记之与转移地址有关的寻址方式
- C++学习笔记(七)----向量(vector)的实现
- Go语言学习笔记4——struct
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- C 语言 实现 字符串 分割 函数(返回"二维字符数组",及分割后的字符数组的长度)
- 一个工作流引擎脚本语言底层模型及实现
- 用纯JAVA语言编程读取MAC地址的实现
- 汇编语言学习笔记之物理地址