切片元素未在 go 中更新

我有一个帐户结构如下:


type Account struct {

    Id       string

    Name     string

    Address  string

    City     string

    Email    string

    Phone    string

    Username string

    Password string

    IsActive bool

}

我也有两个功能:find和update。该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}

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


慕尼黑8549860
浏览 87回答 1
1回答

蓝山帝景

问题是您返回的是元素的副本,而不是数组中元素的实际地址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中查看更新的代码
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go