美文网首页Go语言实践
Go append方法的实现

Go append方法的实现

作者: 如梦又似幻 | 来源:发表于2019-05-23 17:53 被阅读3次

    给定切片 sl,将一个 []byte 数组追加到 sl 后面。写一个函数 Append(slice, data []byte) []byte,该函数在 sl 不能存储更多数据的时候自动扩容。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        appendFunc()
    }
    
    func appendFunc() {
        sl := []byte {'a', 'u', 'z', 's'}
        data := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
        sliceVal := Append(sl, data)
        fmt.Printf("slice = %c \n", sliceVal)
    }
    
    func Append(slice, data []byte) []byte {
        // append的实现原理
        // 直接使用比切片长度还要大的下标时,会报错内存溢出
        // 所以要先make一个新的切片
        lengthNewSlice := len(slice) + len(data)
        // make新的切片时需注意总容量的大小,如果大于原切片,需扩充
        capNewSlice := cap(slice)
        if lengthNewSlice > cap(slice) {
            capNewSlice = lengthNewSlice
        }
    
        // 经测试,数据类型不能作为变量传递进来,所以应该用switch来实现,此处不再赘述
        newSlice := make([]byte, lengthNewSlice, capNewSlice)
        // 接下来赋值
        for sliceKey, sliceItem := range slice {
            newSlice[sliceKey] = sliceItem
        }
        for dataKey, item := range data {
            newSlice[dataKey + len(slice)] = item
        }
        // 赋值操作也可以用copy函数
    
        return slice
    }
    

    相关文章

      网友评论

        本文标题:Go append方法的实现

        本文链接:https://www.haomeiwen.com/subject/abibzqtx.html