结构体内部的Golang切片不追加新值,只保留第一个值

r1zhe5dt  于 2023-03-21  发布在  Go
关注(0)|答案(1)|浏览(113)

我有一个代码,需要添加新的值。目标是同化用户和报价,为此我创建了一个结构体称为“用户报价”。

type UserQuote struct {
        User        models.User
        QuoteNumbers []int
    }

每个用户都有一些引号,但是引号需要被一个用户同化,我创建了一些循环,来获取引号,并随机同化我之前选择的用户,如果这个用户是另一种类型的结构体,这对我的问题来说并不重要,但是你需要知道它们存储在一个名为usersThatBuySweepstakeNumbersBySweepstake的切片中。

for _, quote := range availableQuotes {
        rand.Seed(time.Now().UnixNano())
        randomIndex := rand.Intn(len(usersThatBuySweepstakeNumbersBySweepstake))
        selectedUser := usersThatBuySweepstakeNumbersBySweepstake[randomIndex]
        selectedUserIsInList := false
        for _, userQuote := range usersQuotes {
            if userQuote.User.ID == selectedUser.ID {
                userQuote.QuoteNumbers = append(userQuote.QuoteNumbers, quote)
                selectedUserIsInList = true
            }
        }

        if !selectedUserIsInList {
            usersQuotes = append(usersQuotes, UserQuote{
                User:        selectedUser,
                QuoteNumbers: []int{quote},
            })
        }
    }

如果用户之前没有关联的引号,则不会将其插入到UserQuote结构数组中。在这种情况下,将其插入到以下代码片段中(是之前代码片段的一部分):

if !selectedUserIsInList {
            usersQuotes = append(usersQuotes, UserQuote{
                User:        selectedUser,
                QuoteNumbers: []int{quote},
            })
        }

正如你所看到的,“QuoteNumbers”数组已经初始化了但是,如果已经插入了,struct内部的“QuoteNumbers”数组应该被追加,这里我们有一个问题:没有追加!代码已被剪切

for _, userQuote := range usersQuotes {
            if userQuote.User.ID == selectedUser.ID {
                userQuote.QuoteNumbers = append(userQuote.QuoteNumbers, quote)
                selectedUserIsInList = true
            }
        }

这段代码只插入了这个切片的第一个元素“QuoteNumbers”,后面的就不追加了。
我正在调试应用程序,并确信“append”的调用超出预期,但切片只保留了创建结构“instance”时插入的第一个元素
以下代码已被截取,所有代码已被截取,但顺序在一起:

type UserQuote struct {
        User        models.User
        QuoteNumbers []int
    }
    usersQuotes := make([]UserQuote, 0)

    //TODO
    if len(usersThatBuySweepstakeNumbersBySweepstake) == 0 {

    }

    availableQuotes := GetAvailableSweepStakesNumbersNumbers(sweepStake.ID)
    if availableQuotes == nil || len(availableQuotes) == 0 {
        c.AbortWithStatusJSON(400, gin.H{
            "message": "Não há mais números disponíveis para este sorteio",
        })
    }

    //TODO
    for _, quote := range availableQuotes {
        rand.Seed(time.Now().UnixNano())
        randomIndex := rand.Intn(len(usersThatBuySweepstakeNumbersBySweepstake))
        selectedUser := usersThatBuySweepstakeNumbersBySweepstake[randomIndex]
        selectedUserIsInList := false
        for _, userQuote := range usersQuotes {
            if userQuote.User.ID == selectedUser.ID {
                userQuote.QuoteNumbers = append(userQuote.QuoteNumbers, quote)
                selectedUserIsInList = true
            }
        }

        if !selectedUserIsInList {
            usersQuotes = append(usersQuotes, UserQuote{
                User:        selectedUser,
                QuoteNumbers: []int{quote},
            })
        }
    }

我的“附加”有什么问题?

fae0ux8s

fae0ux8s1#

append使用range循环将元素ing到slice时,您应该使用循环索引更新slice元素,而不是更新局部变量(在您的情况下是userQuote):

for _, quote := range availableQuotes {
    // ...
    for i, userQuote := range usersQuotes {
        if userQuote.User.ID == selectedUser.ID {
            usersQuotes[i].QuoteNumbers = append(usersQuotes[i].QuoteNumbers, quote) // update the slice indexed object
            selectedUserIsInList = true
        }
    }

    if !selectedUserIsInList {
        usersQuotes = append(usersQuotes, UserQuote{
            User:        selectedUser,
            QuoteNumbers: []int{quote},
        })
    }
}

相关问题