Skip to content

Instantly share code, notes, and snippets.



Created Mar 25, 2017
What would you like to do?
Playing with logfmt go k=v parser library
package main
import (
// base test case
const t0 = `foo=bar`
// string, int, float, bool
const t1 = `foo=bar baz=3 fl=3.1415926535 bl=true`
// value has multiple words, unquoted
const t2 = `foo=bar ben=one two baz=3`
// value has a quoted string with spaces and an equals sign
const t3 = `foo=bar eq="a test with = signs" baz=3`
// value has an unquoted sign with no spaces but an equals sign
const t4 = `foo=bar unq=astr=with=equals?and*stuff baz=3`
func parseIntoMap(m map[string]interface{}, line []byte) error {
f := func(key, val []byte) error {
keyStr := string(key)
valStr := string(val)
if b, err := strconv.ParseBool(valStr); err == nil {
m[keyStr] = b
return nil
if i, err := strconv.Atoi(valStr); err == nil {
m[keyStr] = i
return nil
if f, err := strconv.ParseFloat(valStr, 64); err == nil {
m[keyStr] = f
return nil
m[keyStr] = valStr
return nil
handler := logfmt.HandlerFunc(f)
return logfmt.Unmarshal(line, handler)
func main() {
for i, str := range []string{t0, t1, t2, t3, t4} {
m := make(map[string]interface{})
parseIntoMap(m, []byte(str))
fmt.Printf("%d: `%s`\n", i, str)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.