登录
首页 >  Golang >  Go问答

为什么我的追加函数会将切片的每个成员更改为要添加的新项目?

来源:stackoverflow

时间:2024-04-07 16:51:36 346浏览 收藏

哈喽!今天心血来潮给大家带来了《为什么我的追加函数会将切片的每个成员更改为要添加的新项目?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在制作一个简单的质因函数,可以放置一个像 [][]int 这样的切片

prime_factors_mult(315) => [[3,2],[5,1],[7,1]]

但我得到的不是这个结果 [[7,1][7,1][7,1][7,1]] ,它后来被缩减为一个空切片,因为它们重复它们自己。我试图一步一步地查看它,它将所有值更改为最后一个附加。我应该怎样做才能避免这种情况?

func prime_factors_mult(x []int)(y [][]int){// Problem 36
    in :=[]int{0,0}
    var k [][]int
    for _,item := range x{
        tok := 0
        for i:=0;i

解决方案


您创建一次 in 切片,然后每次都对其进行修改,因此每次都将完全相同的对象添加到 k

添加一个切片:

k=append(k,[]int{item, tok})

range 的语法每次都会返回值的索引和引用。您选择两次使用引用,并且值会被修改,但您继续附加相同的地址。这就是为什么您只获得最后一个值,范围循环不断修改它,并且您只剩下循环中的最后一个值。

方法一:

为避免这种情况,请将循环更改为 for index := range k 而不是 for _,item := range k 使用循环中的索引并附加 k[index] 而不是 item。

方法 2:

for _, item range something {
  item := item

如果您想保持语法不变,您可以使用从范围中获得的变量在循环内创建一个局部变量。在两个循环块的第一行中添加 item := item 。虽然看起来很奇怪,但这每次都会分配新的 item,并且您将附加并使用那个变量。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么我的追加函数会将切片的每个成员更改为要添加的新项目?》文章吧,也可关注golang学习网公众号了解相关技术文章。

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