Go append方法的实现

给定切片 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方法的实现)