问一个初始化 slice 的问题,
之前初学 golang 的时候,我经常用下面这种方式来使用 slice:
source := []int{1,2,3,4,5}
res := make([]int, 0)
for _,v := range source {
res = append(res, v)
}
后来了解了 slice 的相关源码之后,发现上面这种写法会导致 slice 多次扩容,便将代码优化成了这种:
source := []int{1,2,3,4,5}
res := make([]int, len(source))
for k,v := range source {
res[k] = v
}
但是遇到一个问题,就是有的时候 source 里面的内容不是我想要的,需要对 v 或者 k 做判断再赋值,如果不符合要求就 continue ,用上面这种方案就会导致 res 部分 index 下是默认的空值 0 。
发现这一情况之后,又改成了下面这种形式:
source := []int{1,2,3,4,5}
res := make([]int, 0, len(source))
for k,v := range source {
if condition {
res = append(res, v)
}
}
因为初始化的时候设置了 cap 字段,这种方案不会像第一个方案那样发生扩容,目前是我想到的最优解了,我想问这种场景下这种 slice 的初始化是最优方案了吗?
之前初学 golang 的时候,我经常用下面这种方式来使用 slice:
source := []int{1,2,3,4,5}
res := make([]int, 0)
for _,v := range source {
res = append(res, v)
}
后来了解了 slice 的相关源码之后,发现上面这种写法会导致 slice 多次扩容,便将代码优化成了这种:
source := []int{1,2,3,4,5}
res := make([]int, len(source))
for k,v := range source {
res[k] = v
}
但是遇到一个问题,就是有的时候 source 里面的内容不是我想要的,需要对 v 或者 k 做判断再赋值,如果不符合要求就 continue ,用上面这种方案就会导致 res 部分 index 下是默认的空值 0 。
发现这一情况之后,又改成了下面这种形式:
source := []int{1,2,3,4,5}
res := make([]int, 0, len(source))
for k,v := range source {
if condition {
res = append(res, v)
}
}
因为初始化的时候设置了 cap 字段,这种方案不会像第一个方案那样发生扩容,目前是我想到的最优解了,我想问这种场景下这种 slice 的初始化是最优方案了吗?