rimraf
rimraf

Reputation: 4126

Golang: response struct having multiple possible types for field

I want to send a response from my api with a unified structure for all responses

type formattedResponse struct {
    Status string
    Data []dataStruct
}

type dataStruct struct {
    Name string
    Phone string
}

I want to have Data be able to be different structs and not just the single dataStruct. I can tell that i'm not using this pattern correctly. What is the correct way to accomplish this sort of thing? Is there a way to have a struct field be able to be any type with the same key?

Upvotes: 1

Views: 11023

Answers (2)

RuNpiXelruN
RuNpiXelruN

Reputation: 1920

@archaeopteryx what you could do is define the returned Data property as an Interface. See my example below,

type Data interface {
    LogData() string
}

type formattedResponse struct {
    Status string
    Data []Data
}

type userData struct {
    Name string
    Phone string
}

func (u userData) LogData() string {
    fmt.Sprintln("This is some shared function")
}

You'd ideally come up with a function more useful than LogData that can be shared by all returned types but hopefully you get the idea. As long as another struct has the same function(s) within the interface it will implement it, and so satisfy as being part of the returned slice

I hope that makes sense!

Upvotes: 1

mangusta
mangusta

Reputation: 3544

I guess this is what you need - you would like to use the same "base" struct with different field types:

package main

type formattedResponse struct {
    Status string
    Data interface{}
}

type dataStruct1 struct {
    Name string
    Phone string
}

type dataStruct2 struct {
    Office string
    Location string
}

func main() {

     // using formattedResponse with dataStruct1 

     fr1 := formattedResponse{
           Status: "ok",
     }
     
     if fr1.Data == nil {
               fr1.Data = make([]dataStruct1, 0)
     }  
    
     fr1.Data = append(fr1.Data.([]dataStruct1), dataStruct1{Name: "n1", Phone: "12345"})


     // using formattedResponse with dataStruct2
 
     fr2 := formattedResponse{
           Status: "ok",
     }
     
     if fr2.Data == nil {
               fr2.Data = make([]dataStruct2, 0)
     }  
    
     fr2.Data = append(fr2.Data.([]dataStruct2), dataStruct2{Office: "o2", Location: "Paris"})

}

Upvotes: 2

Related Questions