小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《改变内部构造中的引用》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
问题内容我一直在尝试更新结构内的映射变量,但没有成功。
我预计 golang 中的映射是通过引用传递的,因此将一个引用分配给另一个引用应该可行,但事实并非如此。
我可能在这里遗漏了一些明显的东西,如果是这样的话,抱歉!
package main
import (
"fmt"
)
type Foo struct {
t map[string]interface{}
}
func (F Foo) Set(ta map[string]interface{}) {
F.t = ta
}
func (F Foo) Get() map[string]interface{} {
return F.t
}
func main() {
t := make(map[string]interface{})
t["t"] = "sf"
t["array"] = []int{1, 2, 3}
fmt.Println(t) // prints map[t:sf array:[1 2 3]]
var f Foo
f.Set(t)
// why the following?
fmt.Println(f.t) //prints map[]
f.t = t
fmt.Println(f.t) //prints map[t:sf array:[1 2 3]]
}
演示:https://play.golang.org/p/i1esv1bdjgq
解决方案
基本上,您的 set
方法需要一个指针接收器才能更改结构的状态。
带有指针接收器的方法可以修改接收器指向的值。由于方法经常需要修改其接收器,因此指针接收器比值接收器更常见。
get
还应该有一个指针接收器以保持一致性:
接下来是一致性。如果该类型的某些方法必须具有指针接收器,则其余方法也应该具有指针接收器,因此无论如何使用该类型,方法集都是一致的。详情请参阅section on method sets。
请参阅 a tour of go 了解更多示例。
这是您的代码的修复:
package main
import (
"fmt"
)
type foo struct {
t map[string]interface{}
}
func (f *foo) set(ta map[string]interface{}) {
f.t = ta
}
func (f *foo) get() map[string]interface{} {
return f.t
}
func main() {
t := make(map[string]interface{})
t["t"] = "sf"
t["array"] = []int{1, 2, 3}
fmt.println(t)
var f foo
f.set(t)
fmt.println(f.get()) //prints map[t:sf array:[1 2 3]]
f.t = t
fmt.println(f.get()) //prints map[t:sf array:[1 2 3]]
}
输出
map[t:sf array:[1 2 3]]
map[t:sf array:[1 2 3]]
map[t:sf array:[1 2 3]]
自己尝试一下here
今天关于《改变内部构造中的引用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!