使用map [string] SpecificType和map [string] SomeInterface的方法进入

时间:2016-09-09 01:20:33

标签: go

我使用下面的代码得到[Object, Object, Object] ,如何将具体的地图类型传递给需要接口类型的方法?

https://play.golang.org/p/G7VzMwrRRw

2 个答案:

答案 0 :(得分:1)

Go的接口约定与Java中的工作方式完全不同(并且设计师显然不喜欢getter和setter的想法: - /)。所以你有两个核心问题:

  1. 一个map [string] Foo与map [string] Bar不同,即使Bar实现了Foo,所以你必须先将它分解出来(事先使用make(),然后在一个赋值中赋值)
  2. 接口方法是通过值调用的,没有指针,所以你真的需要在你的调用者中执行foo = foo.Method(bar),或者真的很高兴能够实现这样的事情。
  3. 你可以做些什么来或多或少地模拟你想要的东西:

    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
    

    最终值=处理方法获取值对象的新副本的事实,因此原始方法将不受您的方法影响(更改将消失)。

    更新了the Go Playground

    上的代码

    ...但它并不是特别惯用Go - 他们真的希望你只是引用struct成员而不是在接口中使用Java风格的mutators(虽然TBH我不是那么热衷于那个小细节 - mutators是supes方便做验证)。

答案 1 :(得分:1)

由于两种地图类型不同,您无法执行您想要执行的操作。一个元素类型是实现接口的类型并不重要,该接口是另一个的元素类型。传递给函数的地图类型必须为map[string]IterableWithID。您可以创建该类型的地图,将类型MyType的值指定给地图,然后将其传递给该函数。

请参阅https://play.golang.org/p/NfsTlunHkW

此外,您可能不希望在MapToList中返回指向切片的指针。只需返回切片本身。切片包含对基础数组的引用。