zoukankan      html  css  js  c++  java
  • go语言笔记——append底层实现和Cpp vector无异,只是有返回值,double后返回了新的vector地址而已

    切片的复制与追加

    如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 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 == 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
  • 相关阅读:
    级联
    自定义Exception
    正则表达式
    配置baseDao(hibernateTemplate)
    BigDecimal
    递归调用
    1,怎么获得数据库表结构。
    常用工具
    《ASP.NET企业级开发案例精解》源代码
    【转载】在jQuery EasyUI中实现对DataGrid进行编辑
  • 原文地址:https://www.cnblogs.com/bonelee/p/6862461.html
Copyright © 2011-2022 走看看