无法访问另一个函数中更改的struct字段

时间:2016-11-17 07:15:57

标签: arrays pointers go struct slice

我是初学者。我在函数列表中创建了一个struct的对象数组,并将该对象数组的地址传递给另一个函数changelist。在我的函数changelist中,我将它作为指针。我想编辑这个函数中传递的数组对象的一些字段更改列表并将其传递回被调用的函数列表。当我尝试在我的被调用函数中访问它时,我无法从更改列表函数访问更新版本。

Here is my code
type Mail struct {
        Name    string
        Address string
        Status  bool
        Error   error
    }
function List(){
          var addressList = make([]Mail,2)
          addressList[0].Name = "Name"
          addressList[0].Address = "Address"
          addressList[1].Name = "Name1"
          addressList[1].Address = "Address"
          newAddress:=changedlist(&addressList)
          fmt.Println(newAddress)
}
function Changedlist(addressList *[]Mail)*[]Mail{
            for _,r:=range *addressList{
                    if r.Name=="Name1"{
                          r.Status=false
                           r.err=errors.New("Error in the name")
                            continue
                        }
                      r.Status=true
                      r.Error=nil
                 }
           return addressList
   }

这里我期待的是名字,当我在我的列表函数中得到这个时,状态将变为真。但是它是假的,这是bool的默认值。这意味着更改不是对实际的数组struct.It正在修改复制的版本。有人请指出我正确的方向如何实现这一点。谢谢。

1 个答案:

答案 0 :(得分:0)

package main

import (
    "errors"
    "fmt"
)

type Mail struct {
    Name    string
    Address string
    Status  bool
    Error   error
}

func List() {
    var addressList = make([]Mail, 2)
    addressList[0].Name = "Name"
    addressList[0].Address = "Address"
    addressList[1].Address = "Address"
    addressList[1].Name = "Name1"
    fmt.Println(addressList)
    newAddress := Changedlist(&addressList)
    fmt.Println(newAddress)
}
func Changedlist(addressList *[]Mail) *[]Mail {
    for k, r := range *addressList {
        if r.Name == "Name1" {
            r.Status = false
            r.Error = errors.New("Error in the name")
            (*addressList)[k] = r
            continue
        }
        r.Status = true
        r.Error = nil
        (*addressList)[k] = r
    }
    return addressList
}

func main() {
    List()
}

// output
[{Name Address false <nil>} {Name1 Address false <nil>}]
&[{Name Address true <nil>} {Name1 Address false Error in the name}]

这是我的代码,它并不完美,但工作正常 有些事情你错了。

  1. &#34;功能&#34;不是关键字,你应该使用&#34; func&#34;代替。
  2. 您使用Changedlist调用函数changedlist
  3. 在for循环中,变量r是数组项的副本,因此如果更改它,数组不会受到影响,我在这里使用(*addressList)[k] = r来更改数组。此外,您可以使用(*addressList)[k].Name = xxx等索引修改它,而不使用r
  4. 那都是 希望这可以帮助你...

    https://play.golang.org/p/zAJ5aJpwwA