Skip to content

Instantly share code, notes, and snippets.

@birowo
Created June 11, 2018 16:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save birowo/37a99fc3b64119dc9477792a20004fb9 to your computer and use it in GitHub Desktop.
Save birowo/37a99fc3b64119dc9477792a20004fb9 to your computer and use it in GitHub Desktop.
seperti https://gist.github.com/birowo/03889aced8ea20c422a45846f4b060a2 dengan penambahan type []struct {k string; v interface{}} untuk akses key-value secara sequential . playground: https://play.golang.org/p/ZZ5Ym8tGgOS
package main
import (
"bytes"
"strconv"
)
func fKV(rslt *bytes.Buffer, v KV) {
i := len(v)
rslt.WriteByte('{')
for _k, _v := range v {
rslt.WriteByte('"')
rslt.WriteString(_k)
rslt.WriteString(`":`)
Marshal(rslt, _v)
i--
if i == 0 {
rslt.WriteByte('}')
return
}
rslt.WriteByte(',')
}
}
func fSlc(rslt *bytes.Buffer, v Slc) {
last := len(v) - 1
rslt.WriteByte('[')
for _, _v := range v[:last] {
Marshal(rslt, _v)
rslt.WriteByte(',')
}
Marshal(rslt, v[last])
rslt.WriteByte(']')
}
func fKVSeq(rslt *bytes.Buffer, v KVSeq) {
last := len(v) - 1
rslt.WriteByte('{')
for _, _v := range v[:last] {
rslt.WriteByte('"')
rslt.WriteString(_v.k)
rslt.WriteString(`":`)
Marshal(rslt, _v.v)
rslt.WriteByte(',')
}
rslt.WriteByte('"')
rslt.WriteString(v[last].k)
rslt.WriteString(`":`)
Marshal(rslt, v[last].v)
rslt.WriteByte('}')
}
func Marshal(rslt *bytes.Buffer, v interface{}) {
switch v.(type) {
case string:
rslt.WriteByte('"')
rslt.WriteString(v.(string))
rslt.WriteByte('"')
case int:
rslt.WriteString(strconv.FormatInt(int64(v.(int)), 10))
case float64:
rslt.WriteString(strconv.FormatFloat(v.(float64), 'f', -1, 64))
case KV:
fKV(rslt, v.(KV))
case Slc:
fSlc(rslt, v.(Slc))
case KVSeq:
fKVSeq(rslt, v.(KVSeq))
default:
println("unsupported type")
}
}
type (
KV map[string]interface{}
Slc []interface{}
KVSeq []struct {
k string
v interface{}
}
)
func main() {
kvseq := KVSeq{
{"a", 123},
{"b", Slc{1, 2}},
{"c", 1.23},
{"d", Slc{1.2, 2.3}},
{"e", KVSeq{{"a", 123}}},
{"f", Slc{KVSeq{{"a", 12}}, KVSeq{{"b", 23}}}},
{"g", "abc"},
{"h", Slc{"ab", "bc"}},
}
var rslt2 bytes.Buffer
Marshal(&rslt2, kvseq)
println(rslt2.String())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment