Skip to content
This repository has been archived by the owner on Oct 11, 2018. It is now read-only.

Is there any option to create structs from map? #47

Closed
aacanakin opened this issue Mar 5, 2016 · 6 comments
Closed

Is there any option to create structs from map? #47

aacanakin opened this issue Mar 5, 2016 · 6 comments
Labels

Comments

@aacanakin
Copy link

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

@fatih
Copy link
Owner

fatih commented Mar 7, 2016

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 fatih closed this as completed Mar 7, 2016
@atombender
Copy link

@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.

@fatih
Copy link
Owner

fatih commented May 10, 2016

@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.

@fatih fatih reopened this May 10, 2016
@titpetric
Copy link

titpetric commented May 20, 2016

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.

@titpetric
Copy link

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.

@fatih
Copy link
Owner

fatih commented Oct 10, 2018

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.

@fatih fatih closed this as completed Oct 10, 2018
@fatih fatih added the archived label Oct 10, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

4 participants