登录
首页 >  Golang >  Go问答

切片元素未在 go 中更新

来源:Golang技术栈

时间:2023-04-08 08:02:18 175浏览 收藏

大家好,今天本人给大家带来文章《切片元素未在 go 中更新》,文中内容主要涉及到golang,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我有一个帐户结构如下:

type Account struct {
    Id       string
    Name     string
    Address  string
    City     string
    Email    string
    Phone    string
    Username string
    Password string
    IsActive bool
}

我也有两个功能:findupdate。该find函数从切片中找到某个元素并返回指向该元素的指针:

func find(accounts []Account, username string) *Account {
    for _, acc := range accounts {
        if acc.IsActive && acc.Username == username {
            return &acc
        }
    }
    return nil
}

更新函数从参数更改某些字段:

func update(account *Account, name string) {
    account.Name = name
}

main中,我尝试find从切片中提取一个元素并将其存储到帐户指针。然后,我尝试update下一行中的一个字段。这就是我的main样子:

func main() {
    accounts := []Account{{
        Id:       "1",
        Name:     "name",
        Address:  "address",
        City:     "city",
        Email:    "email@email.com",
        Phone:    "123456789",
        Username: "username",
        Password: "1234",
        IsActive: true,
    }}
    var acc *Account
    acc = find(accounts, "username")
    fmt.Printf("%v\n", accounts)
    fmt.Println(acc)

    update(acc, "updated")
    fmt.Printf("%v\n", accounts)
    fmt.Println(acc)
}

问题是update调用时,切片中的元素没有更新。它只是更新存储帐户的数据。下面是main的输出:

// find
[{1 name address city email@email.com 123456789 username 1234 true}]
&{1 name address city email@email.com 123456789 username 1234 true}

// update
[{1 name address city email@email.com 123456789 username 1234 true}]
&{1 updated address city email@email.com 123456789 username 1234 true}

当存储元素发生变化时,如何使切片内的元素更新?感谢您的帮助,任何建议将不胜感激。

正确答案

问题是您返回的是元素的副本,而不是数组中元素的实际地址

return &acc

如下更改您的查找功能

func find(accounts []Account, username string) *Account {
for idx , acc := range accounts {
    if acc.IsActive && acc.Username == username {
        return &accounts[idx]
    }
}
return nil
}

你会得到预期的回应

[{1 name address city email@email.com 123456789 username 1234 true}]
&{1 name address city email@email.com 123456789 username 1234 true}
[{1 updated address city email@email.com 123456789 username 1234 true}]
&{1 updated address city email@email.com 123456789 username 1234 true}

您可以在 go playground中查看更新的代码

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《切片元素未在 go 中更新》文章吧,也可关注golang学习网公众号了解相关技术文章。

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