【问题标题】:cannot access the struct field changed in another function无法访问在另一个函数中更改的结构字段
【发布时间】:2017-03-31 15:17:11
【问题描述】:

我是 go lang 的初学者。我在函数列表中创建了一个结构的对象数组,并将该对象数组的地址传递给另一个函数更改列表。在我的函数更改列表中,我将它作为指针获取。我想编辑此函数内传递的数组对象的一些字段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
   }

这里我期望的是名称,当我在列表函数中得到它时,状态将变为 true。但它是 false,这是 bool 的默认值。这意味着更改不是对实际的数组结构。它正在修改复制的版本。有人可以指出正确的方向如何实现这一点..谢谢。

【问题讨论】:

  • 第一:完成整个围棋之旅 (tour.golang.org)。第二:不要使用指向切片的指针。第三。再次游览。第四:for 循环中的r 是地址列表元素的副本:当改变切片时使用for i := range slice。再次环游世界。
  • 我建议你在写任何东西之前阅读更多关于语言规范的内容
  • 感谢沃尔克。我认为你的建议对我很有帮助。会学到更多......谢谢

标签: arrays pointers go struct slice


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2018-04-04
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多