3 回答
TA贡献1801条经验 获得超15个赞
您可以以这种方式使用接口,添加一个方法GetFoo来获取每个结构的 foo。
type A struct{
Foo map[string]string
}
func(a *A) GetFoo() map[string]string {
return a.Foo
}
type B struct{
Foo map[string]string
}
func(b *B) GetFoo() map[string]string {
return b.Foo
}
type C struct{
Foo map[string]string
}
func(c *C) GetFoo() map[string]string {
return c.Foo
}
type ABC interface {
GetFoo() map[string][string]
}
func handleFoo (v ABC){
foo := v.GetFoo()
x:=foo["barbie"]
}
TA贡献1789条经验 获得超8个赞
你可以尝试reflect
传递interface{}
给handleFoo
https://play.golang.org/p/sLyjDvVrUjQ
https://golang.org/pkg/reflect/
package main
import (
"fmt"
"reflect"
)
func main() {
type A struct {
Foo map[string]string
}
type B struct {
Foo map[string]int
}
type C struct {
Foo map[string]uint
}
a := A{
Foo: map[string]string{"a":"1"},
}
b := B{
Foo: map[string]int{"a":2},
}
c := C {
Foo: map[string]uint{"a":3},
}
fmt.Println(a, b, c)
handleFoo(a)
handleFoo(b)
handleFoo(c)
fmt.Println(a, b, c)
}
func handleFoo(s interface{}) {
v := reflect.ValueOf(s)
foo := v.FieldByName("Foo")
if !foo.IsValid(){
fmt.Println("not valid")
return
}
switch foo.Type() {
case reflect.TypeOf(map[string]string{}):
fmt.Println("is a map[string]string")
foo.Interface().(map[string]string)["a"] = "100"
case reflect.TypeOf(map[string]int{}):
fmt.Println("is a map[string]int")
foo.Interface().(map[string]int)["a"] = 200
case reflect.TypeOf(map[string]uint{}):
fmt.Println("is a map[string]uint")
foo.Interface().(map[string]uint)["a"] = 300
}
}
- 3 回答
- 0 关注
- 108 浏览
添加回答
举报