2016-11-17 96 views
0

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

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 
    } 

这里我所期待的是名字,当我得到这个在我的列表中的状态将成为真正的function.But它是假的,其是bool.This的默认值是指变化不做到实际的数组struct.It是修改复制版本。可以有人请指出我在正确的方向如何实现这一目标..谢谢。

+3

第一:通过围棋的整体旅游工作(HTTPS ://tour.golang.org/)。第二:不要使用指向切片的指针。第三。再去一趟。第四:for循环中的'r'是地址列表元素的副本:当变更片时,使用'for i:= range slice'。再次去旅行。 – Volker

+1

我建议你在写任何东西之前多阅读一下语言规范 –

+0

谢谢volker。我认为你的建议帮助了我很多。将学习更多..感谢 –

回答

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. “功能”不是关键字,您应该使用“func”代替。
  2. 您使用changedlist调用函数Changedlist
  3. in for循环中,变量r是数组项的副本,所以如果你改变了它,数组不会受到影响,我在这里用(*addressList)[k] = r来改变数组。此外,您还可以用像(*addressList)[k].Name = xxx指数修改,而不会使用r

这是所有
希望这可以帮助你......

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

+0

谢谢.....这解决了它 –

相关问题