fatih / structs

Utilities for Go structs

Home Page:http://godoc.org/github.com/fatih/structs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Is there any option to create structs from map?

aacanakin opened this issue · comments

What I need currently is to be able to convert map into a struct. Is it possible currently?

Hi @aacanakin

For now structs doesn't support this feature. Maybe in the future we might support it. But there is already an excellent package that does what you want: https://github.com/mitchellh/mapstructure.

@fatih: Would like to see this. It seems like a pretty glaring hole in this package's functionality. As it stands, you have to use structs and mapstructure together to serialize back/forth between maps, and in principle there's no guarantee that the serialization is even equivalent.

@atombender you're totally right actually. Thinking now, we should maybe have something like this. I'm reopening the issue, tough I might not have the time for now. I'm open to contributions, if anyone wants to contribute, please open a new issue and write your thoughts on how you want to implement it so it's easy to proceed.

I would like to extend this issue/feature request with partial assignment. For example:

type FullExample {
    a string
    b string
    c string
}

type PartialExample {
    a string
}

var := PartialExample{ a: "partial fill" };
var2 := FullExample{};
structs.Fill(&var2, var);

It would be awesome if var2 would be filled out with fields which match whatever is in var. I'm about to write this bunch of code to handle the split between database (full schema)/web forms (partial), and I'm sure there are other use cases as well. It's the second time that casting has failed me in recent few months.

Feel free to use it for partial struct updates like in the example mentioned above. It's just something I hacked together quickly, not sure if it can be included as is. Feel free to give comments and I'm up for submitting a PR for this, if it's needed:

func updateStruct(dest interface{}, src interface{}) {
        mDest := structs.Map(dest)
        mSrc := structs.Map(src)
        for key, val := range mSrc {
                if _, ok := mDest[key]; ok {
                        structs.New(dest).Field(key).Set(val);
                }
        }
}

It basically includes the logic to assign all existing Map elements into a struct (dest). Depending on what structs.Map does when it gets a map as a parameter - it might solve the issue of OP.

Hi,

Unfortunately, I'm archiving this project and will no longer maintaining it. For more information, please read my blog post: Taking an indefinite sabbatical from my projects.

Thanks for the feedback and contribution.