arrays - 无法访问在另一个函数中更改的结构字段

标签 arrays pointers go struct slice

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

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 的默认值。这意味着没有对实际进行更改array struct。它正在修改复制的版本。有人可以指出正确的方向如何实现这一点..谢谢。

最佳答案

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. “function”不是关键字,您应该使用“func”代替。
  2. 您使用 changedlist 调用函数 Changedlist
  3. 在for循环中,变量r是数组项的副本,所以如果你改变它,数组不受影响,我使用了(*addressList)[k] = r 在这里改变数组。此外,您可以使用 (*addressList)[k].Name = xxx 之类的索引对其进行修改,而无需使用 r

就这样
希望这可以帮助你...

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

关于arrays - 无法访问在另一个函数中更改的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40648828/

相关文章:

javascript - (循环中的图像)大量图像并且想要显示如果图像确实存在则显示图像否则删除/隐藏图像节点

java - 如何获取 'Array of JTextField' 的值并将其存储在整数数组中?

c - 动态分配内存时 "pointer types"有什么意义?

go env 显示 GOPATH 不匹配

serialization - 如何反序列化非标准大小的字段?

java - 在二维数组中找到到角点的最短路径

java - 我试图直接将值作为参数发送到我的数组,但它不起作用

c++ - 如何制作指针迭代器?

objective-c - 通过OSX Cron运行时,Objective C命令失败

go - 在 Go 中列出目录