首页 > 解决方案 > 如何优雅地使切片附加安全

问题描述

slice := []int{10, 20, 30, 40, 50,60}

newSlice := slice[2:4:5]



fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice,70)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice,80)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

输出将是

old slice is [10 20 30 40 50 60] 
new slice is [30 40] 
old slice is [10 20 30 40 70 60] 
new slice is [30 40 70] 
old slice is [10 20 30 40 70 60] 
new slice is [30 40 70 80] 

追加具有不同的行为。我知道导致追加具有不同行为的原因。因为当新切片容量大于长度时新旧共享数组,但是追加80,容量不够大,所以创建一个新数组。所以检查容量将避免追加有不同的行为,或者我可以定义新切片newSlice := slice[2:4:4]

有什么优雅的解决方案吗?因为每次追加前检查有点难看,而且在某些情况下,我希望新旧可以一直共享切片。如何让它优雅地发生?

标签: goslice

解决方案


要在追加中强制分配新的后备数组,请使用长度和容量相等的切片。使用三值切片表达式创建该切片。

newSlice = append(newSlice[:len(newSlice):len(newSlice)], 70)

在操场上运行它

如问题中所述,您还可以使用以下方法创建具有相同长度和容量的切片:

newSlice := slice[2:4:4]

在操场上运行它


推荐阅读