Go 有没有更惯用的方法来基于输入创建特定类型的变量?

Go 有没有更惯用的方法来基于输入创建特定类型的变量?,go,Go,在中,我创建了我的代码的一个人为版本,其中我基于输入字符串创建了一个X类型的变量。变量将是少数几种类型之一,并实现一个接口 代码目前编译并提供了正确的结果,但是它给我的印象是相当冗长,我正在尝试寻找是否有一种简捷的方法来实现我正在实现的结果。这个示例有3种类型(dog、cat和bird)来实现接口(animal),但是我的实际代码在这个switch语句中最多有40种类型 我之所以使用这段代码,是因为在从DBMS检索结果时,我尝试使用一种通用的加载方法,当与组合使用时,会根据输入字符串将数据库表加

在中,我创建了我的代码的一个人为版本,其中我基于输入字符串创建了一个X类型的变量。变量将是少数几种类型之一,并实现一个接口

代码目前编译并提供了正确的结果,但是它给我的印象是相当冗长,我正在尝试寻找是否有一种简捷的方法来实现我正在实现的结果。这个示例有3种类型(dog、cat和bird)来实现接口(animal),但是我的实际代码在这个switch语句中最多有40种类型

我之所以使用这段代码,是因为在从DBMS检索结果时,我尝试使用一种通用的加载方法,当与组合使用时,会根据输入字符串将数据库表加载到正确的结构中。我可以完全控制应用程序,如果需要,可以将输入字符串更改为另一种类型

操场链接代码:

package main

import (
    "fmt"
)

type animal interface {
    call() string
}

type dog struct {
}

func (d *dog) call() string {
    return "Woof!"
}

type cat struct {
}

func (c *cat) call() string {
    return "Meow!"
}

type bird struct {
}

func (c *bird) call() string {
    return "Chirp!"
}

func main() {
    var animal animal
    animalType := "dog"
    switch animalType{
    case "dog":
        animal = new(dog)
    case "cat":
        animal = new(cat)
    case "bird":
        animal = new(bird)

您可以创建一个从“string”到“function that returns animal”的hashmap,但是设置它要比switch语句更详细

类似这样的东西(未测试)


但是它比switch语句要详细得多,并且模糊了本来应该明确和清晰的内容。

您可以创建一个从“string”到“function that returns animal”的hashmap,但是设置它比switch语句要详细得多

类似这样的东西(未测试)


但是它比switch语句要详细得多,并且模糊了本来应该明确和清晰的内容。

该代码是明确的,易于理解和键入safe@zerkms我的问题有没有一个更简短,但仍然易于理解和类型安全的解决方案?我不确定“每种类型2行”价格太高,不必麻烦。每个问题都必须独立完成,没有以下外部链接。链接(比如操场)对于额外的信息来说是很好的,但是链接会消失。请把所有相关的代码直接放到你的问题中。这些代码是明确的,易于理解和输入safe@zerkms对于我的问题,有没有一个更简短、但仍然易于理解且类型安全的解决方案?我不确定“每种类型2行”的价格是否太高,不值得麻烦。每个问题都必须独立完成,而不必遵循外部链接。链接(比如操场)对于额外的信息来说是很好的,但是链接会消失。请将所有相关代码直接输入您的问题。感谢您的回复,基于您的答案和其他评论者,我将保留代码不变。感谢您的回复,基于您的答案和其他评论者,我将保留代码不变。
type AnimalCtor func() animal

var animalMap map[string]AnimalCtor

.....

func init() {
    animalMap["dog"] = func() animal { return &dog{} }
    animalMap["cat"] = func() animal { return &cat{} }
    animalMap["bird"] = func() animal { return &bird{} }
    .....
}

func createAnimalFromString(input string) animal {
    ctor, ok := animalMap[input]
    if ok {
        return ctor()
    } else {
        return nil
    }
}