通过switch语句分配类型/创建结构

I'm having a bit of trouble figuring out how to either create a struct in a switch statement or assign a type to it in a switch statement. Here's some non-working code illustrating what I'm trying to do:

var result

switch structPickingString {
case "struct1":
    result = new(struct1)
case "struct2":
    result = new(struct2)
}

//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    log.Println(err)
}
//print out that json with a function specific to that type of struct
result.Print()

I think something involving an empty interface{} might be related to solving this issue but unfortunately I'm still a bit ignorant with golang and I'm not seeing how to make it work.

Here's a link to a slightly modified version of the code for more context: https://play.golang.org/p/Rb1oaMuvmU2

The issue is not defining the print function, it's assigning a specific type of struct to the result variable based on using the individual Print function that the struct implements.

Let me know if there's any more info I could provide.

Since you are calling .Print, you need to use an interface which has that method. I think you are looking for something like

type Printer interface {
    Print()
}

func (s *struct1) Print() {
  // ...
}

func (s *struct2) Print() {
  // ...
}
var result Printer
switch structPickingString {
case "struct1":
    result = new(struct1)
case "struct2":
    result = new(struct2)
}

https://play.golang.org/p/W9r6UfeQSCz

I think you want to use an interface like

type ResultIface interface {
     Print()
}

Then you can do

 var result ResultIface

 switch structPickingString {
 case "struct1":
     result = new(struct1)
 case "struct2":
     result = new(struct2)
}

As long as your struct1 and struct2 fulfills the ResultIface by having a Print function it will print

You needs match "generical interface" with structs. See this:

//my struct1
type MyStruct1 struct {
    ID int
}

//my struct2
type MyStruct2 struct {
    ID int
}

//my interface
type MyStructGenerical interface {
    Print()
}

//method (match with MyStructGenerical)
func (m1 MyStruct1) Print() {
    println(m1.ID)
}

//method (match with MyStructGenerical)
func (m2 MyStruct2) Print() {
    println(m2.ID)
}

In this way you can does assertions between structs and generical interface. See this:

//here result is an generical interface
var result MyStructGenerical = nil

//checkin
switch structPickingString {
case "struct1":
    tmp := new(MyStruct1)
    result = tmp
case "struct2":
    tmp := new(MyStruct2)
    result = tmp
}

The result is:

//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(body()).Decode(&result); err != nil {
    log.Println(err)
}

//print out that json with a function specific to that type of struct
tmp := result.(*MyStruct1)
tmp.Print()
// or
result.Print()

Run in: https://play.golang.org/p/nHrJnImsqNN