mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-15 11:58:11 -05:00
47 lines
1.6 KiB
Markdown
47 lines
1.6 KiB
Markdown
|
# mapstructure [![Godoc](https://godoc.org/github.com/mitchellh/mapstructure?status.svg)](https://godoc.org/github.com/mitchellh/mapstructure)
|
||
|
|
||
|
mapstructure is a Go library for decoding generic map values to structures
|
||
|
and vice versa, while providing helpful error handling.
|
||
|
|
||
|
This library is most useful when decoding values from some data stream (JSON,
|
||
|
Gob, etc.) where you don't _quite_ know the structure of the underlying data
|
||
|
until you read a part of it. You can therefore read a `map[string]interface{}`
|
||
|
and use this library to decode it into the proper underlying native Go
|
||
|
structure.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
Standard `go get`:
|
||
|
|
||
|
```
|
||
|
$ go get github.com/mitchellh/mapstructure
|
||
|
```
|
||
|
|
||
|
## Usage & Example
|
||
|
|
||
|
For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure).
|
||
|
|
||
|
The `Decode` function has examples associated with it there.
|
||
|
|
||
|
## But Why?!
|
||
|
|
||
|
Go offers fantastic standard libraries for decoding formats such as JSON.
|
||
|
The standard method is to have a struct pre-created, and populate that struct
|
||
|
from the bytes of the encoded format. This is great, but the problem is if
|
||
|
you have configuration or an encoding that changes slightly depending on
|
||
|
specific fields. For example, consider this JSON:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"type": "person",
|
||
|
"name": "Mitchell"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Perhaps we can't populate a specific structure without first reading
|
||
|
the "type" field from the JSON. We could always do two passes over the
|
||
|
decoding of the JSON (reading the "type" first, and the rest later).
|
||
|
However, it is much simpler to just decode this into a `map[string]interface{}`
|
||
|
structure, read the "type" key, then use something like this library
|
||
|
to decode it into the proper structure.
|