如何将任何结构作为参数发送给方法并返回该结构?

时间:2018-07-23 15:41:39

标签: go struct yaml

我是Go的新手,我正在寻找是否有一种方法可以接收任何结构作为参数。

我的代码中有类似这样的函数,它对5个结构执行完全相同的操作并返回相同的结构,但是我不知道是否可以这样做。我想知道我是否可以做这样的事情:

type Car struct {
     Model   string `yaml:"Model"`
     Color   string `yaml:"Color"`
     Wheels  int    `yaml:Wheels"`
     Windows int    `yaml:"Windows"` 
}

type Motorcycle struct {
     Model    string `yaml:"Model"`
     Color    string `yaml:"Color"`
     Wheels   int      `yaml:Wheels"`
}

type Bus struct {
     Model      string `yaml:"Model"`
     Color      string `yaml:"Color"`
     Wheels     int    `yaml:Wheels"`
     Passengers int    `yaml:"Passengers"`
}

func main () {

    car := GetYamlData(Car)
    motorcycle := GetYamlData(Motorcycle)
    Bus := GetYamlData(Bus)
}

func GetYamlData(struct anyStructure) (ReturnAnyStruct struct){

       yaml.Unmarshal(yamlFile, &anyStructure)

       return anyStructure
}

是否可以做类似上面的代码?其实我拥有的是这样的:

func main(){
   car, _, _ := GetYamlData("car")
    _,motorcycle,_ := GetYamlData("motorcycle")
    _,_,bus := GetYamlData("bus")
 }

func GetYamlData(structureType string) (car *Car, motorcycle *Motorcycle, bus *Bus){

 switch structureType{

        case "car":
                yaml.Unmarshal(Filepath, car)
        case "motorcycle":
                yaml.Unmarshal(Filepath, motorcycle)
        case "bus":
                yaml.Unmarshal(Filepath, bus)
 }

 return car, motorcycle, bus

}

随着时间的增加,它将返回很多值,而我不希望有很多返回值,有没有办法用我发布的第一个代码来做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以采用与yaml.Unmarshal完全相同的方式进行操作,方法是将一个值解编为:

func GetYamlData(i interface{}) {
    yaml.Unmarshal(Filepath, i)    
}

用法示例:

func main () {
    var car Car
    var motorcycle Motorcycle
    var bus Bus
    GetYamlData(&car)
    GetYamlData(&motorcycle)
    GetYamlData(&bus)
}