【问题标题】:How can I make a map of parent structs in go?如何在 go 中制作父结构的映射?
【发布时间】:2020-04-16 03:20:39
【问题描述】:

我来自 Java/Kotlin,所以我对 Go 所处的组合优于继承的世界有点陌生 :)

所以在Java中,我可以制作一个

abstract class Pet

和一个子类

class Dog extends Pet
class Cat extends Pet

然后做一个

Map<String, Pet> mapOfPets = HashMap();
mapOfPets.put("puppy",  new Dog());
mapOfPets.put("kitty",  new Cat());

从这里开始,我尝试在 Golang 中做同样的事情。这是我的尝试的进展情况

struct Pet{
 // ...
}
struct Dog{
  Pet
}
struct Cat{
  Pet
}
func () {
  petMap := make(map[string]*Pet)

  //invalid
  petMap["puppy"] = &Dog{ ... } 
  petMap["kitty"] = &Cat{ ... }

  // valid
  puppy2 := &Dog{ ... }
  kitty2 := &Cat{ ... }
  petMap["puppy2"] = &puppy2.Pet
  petMap["kitty2"] = &kitty2.Pet
}()

我知道代码的 有效 部分应该可以工作,但是我丢失了 Dog 和 Cat 类中的内容。我应该如何为地图和/或结构建模,以便能够制作类似于代码的 invalid 部分的内容?

为每个“子类”创建地图会很烦人(我知道这里的术语不正确)

PS:任何关于我应该如何进行作曲的文章或指南也将不胜感激!

谢谢!

【问题讨论】:

  • “我应该如何作曲”让我想起了How to draw an owl。这不是一个有形的问题。由于在 Go 中没有替代方案(如继承),这与问“如何在 Go 中编程?”是一样的。暂时忘记嵌入可能会有所帮助。它看起来像 OO 语言中的继承,并且经常误导新手,在大多数情况下,只需编写更多代码即可将其替换:play.golang.org/p/TMF6jWsKwLn
  • 不要考虑“子类”、继承或类型层次结构;没有了。不要试图在 Go 中做一个 Java“等价物”,这些语言是不等价的。如果你用 Go 编写,你需要为 Go 设计;如果你为 Java 设计并用 Go 编写,你会遇到无穷无尽的问题。

标签: go go-map


【解决方案1】:

您应该为此使用接口。您的地图将是map[string]Pet,其中Pet 是:

type Pet interface {
  // methods an implementer of Pet should have
}

那么您的具体类型(Dog 等)将通过使用正确的方法来实现 Pet 接口。

有关接口的更多信息,请参阅Tour of Gogobyexample 等。接口将在任何 Go 入门指南中进行广泛描述。

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多