douda5227 2019-01-16 23:20
浏览 37
已采纳

是否有更惯用的方法根据输入来创建特定类型的变量?

In this playground link I have created a contrived version of my code where I am creating a variable of type X based on an input string. The variable will be one of a handful of types and implement an interface.

The code currently compiles and provides the correct result, however it strikes me as quite verbose and I'm trying to find if there is a shorthand approach to the result I'm achieving. The example has 3 types (dog, cat & bird) that implement the interface (animal), however my actual code will have up to 40 types in this switch statement.

The reason I am using this code is when retrieving results form a DBMS, I'm trying to use a generic load method that, when combined with sqlx, loads the database table into the correct struct based on the input string. I have entire control over the application and can change the input string to another type if required.

Code from playground link:

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)
  • 写回答

1条回答 默认 最新

  • doujia4759 2019-01-16 23:54
    关注

    You can create a hashmap from "string" to "function that returns animal" but setting that up would be more verbose than the switch statement.

    Something like this (not tested)

    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
        }
    }
    

    But it's a lot more verbose than the switch statement and obscures what should otherwise be explicit and clear.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?