map存储struct结构体常见的坑
1 使用指针作为方法的 receiver
package main
import (
"fmt"
)
type data struct {
name string
}
type printer interface {
print()
}
// 这里不能使用指针
func (p *data) print() {
fmt.Println("name: ", p.name)
}
/*
//解决方法一: 正确的语法, 不能使用指针
func (p data) print() {
fmt.Println("name: ", p.name)
}
*/
func main() {
d1 := data{"one"}
d1.print() // d1 变量可寻址,可直接调用指针 receiver 的方法
/*
var in printer = data{"two"}
in.print() // Error: 类型不匹配
*/
m := map[string]data{
"x": data{"three"},
}
// 对于 map 存储struct的数据类型, 不能使用指针
m["x"].print() //Error: m["x"] 是不可寻址的 // 变动频繁
// 解决方法二:
r := m["x"]
r.print()
}
/*
cannot use data literal (type data) as type printer in assignment:
data does not implement printer (print method has pointer receiver)
cannot call pointer method on m["x"]
cannot take the address of m["x"]
只要值是可寻址的, 就可以在值上直接调用指针方法。即是对一个方法, 它的 receiver 是指针就足矣。
但不是所有值都是可寻址的, 比如 map 类型的元素、通过 interface 引用的变量:
*/