登录
首页 >  Golang >  Go问答

如何安全地在食物中添加切片

来源:stackoverflow

时间:2024-03-15 21:21:31 422浏览 收藏

切片是 Go 语言中强大的数据结构,但附加操作可能会导致意外行为。当新切片的容量大于其长度时,它将与原始切片共享数组。但是,当容量不足时,将创建一个新数组。 为了避免这种差异,可以通过检查容量或始终创建新切片来解决。然而,这些方法不够优雅。本文提供了一个更优雅的解决方案:先创建新切片,然后逐个元素地附加。这种方法确保新旧切片始终共享切片,并且在每次附加之前无需进行检查。

问题内容

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] 

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

有什么优雅的解决方案吗?因为在每次追加之前进行检查有点难看,并且在某些情况下,我希望新旧可以始终共享切片。如何让它变得优雅?


解决方案


这是随机切片的一个非常好的来源:https://github.com/golang/go/wiki/SliceTricks

在这种情况下,我建议先创建一个新切片,然后每次都附加元素,如下所示:

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

newslice := make([]int, 0)
newslice = append(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 50 60] 
new slice is [30 40 70] 
old slice is [10 20 30 40 50 60] 
new slice is [30 40 70 80]

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何安全地在食物中添加切片》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>