Golang初学者请教:这个自定义的append实现方案是否合理?

Golang初学者请教:这个自定义的append实现方案是否合理?

func customApend(slice []int, val ...int)[]int {
var reslen int = len(slice) + len(val)
var res []int
var rescap  = 1
if cap(slice) < reslen + len(val){
rescap =  (len(slice) + len(val)) * 2
}else {
rescap = cap(slice)
}
res = make([]int, reslen, rescap)
copy(res,slice)
var index = len(slice)
for _,v := range val {
res[index] = v
index +=1
}

return res
}

更多关于Golang初学者请教:这个自定义的append实现方案是否合理?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你可以利用 append 函数

func customApend(slice []int, val ...int) []int {
    res := make([]int, 0, len(slice)+len(val))
    res = append(res, slice...)
    res = append(res, val...)

    return res
}

更多关于Golang初学者请教:这个自定义的append实现方案是否合理?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个自定义的append实现存在几个问题:

  1. 容量计算逻辑错误:第5行的条件判断应该是 cap(slice) < reslen,而不是 cap(slice) < reslen + len(val),因为 reslen 已经包含了 len(slice) + len(val)

  2. 不必要的变量声明rescap 的初始值 1 没有意义,可以直接在条件判断中赋值。

  3. 索引累加可以简化:可以直接在循环中使用 len(slice) 作为起始索引。

修正后的版本:

func customAppend(slice []int, val ...int) []int {
    newLen := len(slice) + len(val)
    var newCap int
    
    if cap(slice) < newLen {
        newCap = newLen * 2
    } else {
        newCap = cap(slice)
    }
    
    result := make([]int, newLen, newCap)
    copy(result, slice)
    
    index := len(slice)
    for _, v := range val {
        result[index] = v
        index++
    }
    
    return result
}

更简洁的实现方式:

func customAppend(slice []int, val ...int) []int {
    newLen := len(slice) + len(val)
    newCap := cap(slice)
    
    if newCap < newLen {
        newCap = newLen * 2
    }
    
    result := make([]int, newLen, newCap)
    copy(result, slice)
    copy(result[len(slice):], val)
    
    return result
}

这个版本使用 copy 函数一次性复制所有追加的值,代码更简洁且性能更好。

回到顶部