我是 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}]
这是我的代码,它并不完美,但可以正常工作。
有些事情你弄错了。
- “function”不是关键字,您应该使用“func”代替。
- 您使用
changedlist
调用函数Changedlist
。 - 在for循环中,变量
r
是数组项的副本,所以如果你改变它,数组不受影响,我使用了(*addressList)[k] = r
在这里改变数组。此外,您可以使用(*addressList)[k].Name = xxx
之类的索引对其进行修改,而无需使用r
就这样
希望这可以帮助你...
关于arrays - 无法访问在另一个函数中更改的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40648828/