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实现存在几个问题:
-
容量计算逻辑错误:第5行的条件判断应该是
cap(slice) < reslen,而不是cap(slice) < reslen + len(val),因为reslen已经包含了len(slice) + len(val)。 -
不必要的变量声明:
rescap的初始值1没有意义,可以直接在条件判断中赋值。 -
索引累加可以简化:可以直接在循环中使用
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 函数一次性复制所有追加的值,代码更简洁且性能更好。

