我使用下面的代码得到[Object, Object, Object]
,如何将具体的地图类型传递给需要接口类型的方法?
答案 0 :(得分:1)
你可以做些什么来或多或少地模拟你想要的东西:
type IterableWithID interface {
SetID(id string) IterableWithID // use as foo = foo.SetID(bar)
}
func (t MyType) SetID(id string) IterableWithID {
t.ID = id
return t
}
...and to deal with the typing problem
t := make(map[string]IterableWithID)
t["foo"] = MyType{}
MapToList(t) // This is a map[string]IterableWithID, so compiler's happy.
...and finally...
value = value.SetID(key) // We set back the copy of the value we mutated
最终值=处理方法获取值对象的新副本的事实,因此原始方法将不受您的方法影响(更改将消失)。
上的代码...但它并不是特别惯用Go - 他们真的希望你只是引用struct成员而不是在接口中使用Java风格的mutators(虽然TBH我不是那么热衷于那个小细节 - mutators是supes方便做验证)。
答案 1 :(得分:1)
由于两种地图类型不同,您无法执行您想要执行的操作。一个元素类型是实现接口的类型并不重要,该接口是另一个的元素类型。传递给函数的地图类型必须为map[string]IterableWithID
。您可以创建该类型的地图,将类型MyType
的值指定给地图,然后将其传递给该函数。
请参阅https://play.golang.org/p/NfsTlunHkW
此外,您可能不希望在MapToList
中返回指向切片的指针。只需返回切片本身。切片包含对基础数组的引用。