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