Golang Go语言中为什么map value是struct时无法改变struct的变量呢?迷惑啊
type data struct {
name string
}
func main() {
m := map[string]data {“x”:{“one”}}
m[“x”].name = “two” //cannot assign to struct field m[“x”].name in map
}
Golang Go语言中为什么map value是struct时无法改变struct的变量呢?迷惑啊
因为你取到的是复制品啊
m := map[string]data {
“x”: data {“one”}
}
n := data {“two”}
m[x] = n
更多关于Golang Go语言中为什么map value是struct时无法改变struct的变量呢?迷惑啊的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
不好意思, 引号和逗号掉了
雨痕的 Go 学习笔记, 建议看看
https://golang.org/ref/spec#Assignments
Each left-hand side operand must be addressable, a map index expression, or (for = assignments only) the blank identifier. Operands may be parenthesized.
https://golang.org/ref/spec#Address_operators
For an operand x of type T, the address operation &x generates a pointer of type *T to x. The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array. As an exception to the addressability requirement, x may also be a (possibly parenthesized) composite literal. If the evaluation of x would cause a run-time panic, then the evaluation of &x does too.
赋值的对象必须是 addressable,用 *T 吧
嗯,用*T 搞定了
<br>func main(){<br> type data struct {<br> name string<br> }<br><br><br> s := make(map[int]*data)<br><br> s[1] = &data{name: "aa"}<br><br> s[1].name = "bb"<br><br> fmt.Println(*s[1])<br><br>}<br>
在Golang中,当你尝试直接通过map的value(该value是一个struct)去修改struct的字段时,可能会遇到一些困惑。这主要是因为Go语言中的map和struct值传递的特性。
在Go中,无论是map的value还是普通的变量传递,struct都是按值传递的,这意味着当你从一个map中获取一个struct值时,你实际上得到的是这个struct的一个副本,而不是原始struct的引用。因此,对这个副本的任何修改都不会影响到原始的struct。
要解决这个问题,你有几个选项:
-
使用指针:将struct封装在指针中,并将指针作为map的值。这样,你就可以通过指针来修改原始的struct。例如,
map[string]*MyStruct
。 -
返回并重新赋值:修改struct的副本,然后将修改后的副本重新赋值给map。这种方法虽然可以工作,但效率较低,因为它涉及到额外的内存分配和复制。
-
使用函数:定义一个函数来修改struct的字段,并通过参数(无论是值还是指针)将struct传递给这个函数。这种方法在逻辑上更清晰,并且可以通过封装来减少错误。
总之,理解Go中的值传递和引用传递对于处理类似的问题至关重要。在处理复杂的数据结构时,使用指针通常是一个更灵活和高效的选择。