Skip to content

Examples

Complete, copy-pasteable examples. Each is a standalone main function.

JSON Round-Trip

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/json/v1"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    c := json.NewCodec[User]()

    b, err := c.Encode(User{Name: "Alice", Age: 30})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(b)) // {"name":"Alice","age":30}

    var u User
    if err := c.Decode(b, &u); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Name: %s, Age: %d\n", u.Name, u.Age)
}

XML with Struct Tags

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/xml"
)

type Data struct {
    XMLName struct{} `xml:"data"`
    Name    string   `xml:"name"`
}

func main() {
    c := xml.NewCodec[Data]()

    b, err := c.Encode(Data{Name: "example-123"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(b)) // <data><name>example-123</name></data>

    var d Data
    if err := c.Decode(b, &d); err != nil {
        log.Fatal(err)
    }
    fmt.Println(d.Name) // example-123
}

CSV Records

go
package main

import (
    "bytes"
    "fmt"
    "log"

    "github.com/foomo/goencode/csv"
)

func main() {
    c := csv.NewStreamCodec()

    records := [][]string{
        {"name", "age"},
        {"Alice", "30"},
    }

    var buf bytes.Buffer
    if err := c.Encode(&buf, records); err != nil {
        log.Fatal(err)
    }

    var decoded [][]string
    if err := c.Decode(&buf, &decoded); err != nil {
        log.Fatal(err)
    }
    fmt.Println(decoded) // [[name age] [Alice 30]]
}

PEM Block Encoding

go
package main

import (
    "bytes"
    stdpem "encoding/pem"
    "fmt"
    "log"

    "github.com/foomo/goencode/pem"
)

func main() {
    c := pem.NewStreamCodec()

    block := &stdpem.Block{
        Type:  "TEST",
        Bytes: []byte("hello"),
    }

    var buf bytes.Buffer
    if err := c.Encode(&buf, block); err != nil {
        log.Fatal(err)
    }

    var decoded *stdpem.Block
    if err := c.Decode(&buf, &decoded); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Type: %s, Data: %s\n", decoded.Type, string(decoded.Bytes))
    // Type: TEST, Data: hello
}

Base64 Encoding Bytes

go
package main

import (
    "bytes"
    "fmt"
    "log"

    "github.com/foomo/goencode/base64"
)

func main() {
    c := base64.NewStreamCodec()

    var buf bytes.Buffer
    if err := c.Encode(&buf, []byte("hello")); err != nil {
        log.Fatal(err)
    }
    fmt.Println(buf.String()) // aGVsbG8=

    var decoded []byte
    if err := c.Decode(&buf, &decoded); err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(decoded)) // hello
}

Compressed JSON (gzip)

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/gzip"
    "github.com/foomo/goencode/json/v1"
)

type Event struct {
    Type    string `json:"type"`
    Payload string `json:"payload"`
}

func main() {
    c := gzip.NewCodec[Event](json.NewCodec[Event]())

    b, err := c.Encode(Event{Type: "click", Payload: "button-1"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Compressed size: %d bytes\n", len(b))

    var e Event
    if err := c.Decode(b, &e); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Type: %s, Payload: %s\n", e.Type, e.Payload)
}

Compressed JSON (brotli)

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/brotli"
    "github.com/foomo/goencode/json/v1"
)

type Event struct {
    Type    string `json:"type"`
    Payload string `json:"payload"`
}

func main() {
    c := brotli.NewCodec[Event](json.NewCodec[Event]())

    b, err := c.Encode(Event{Type: "click", Payload: "button-1"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Compressed size: %d bytes\n", len(b))

    var e Event
    if err := c.Decode(b, &e); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Type: %s, Payload: %s\n", e.Type, e.Payload)
}

TOML Round-Trip

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/toml"
)

type Config struct {
    Host string
    Port int
}

func main() {
    c := toml.NewCodec[Config]()

    b, err := c.Encode(Config{Host: "localhost", Port: 8080})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(b))

    var cfg Config
    if err := c.Decode(b, &cfg); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Host: %s, Port: %d\n", cfg.Host, cfg.Port)
}

Atomic File Persistence

go
package main

import (
    "fmt"
    "log"

    "github.com/foomo/goencode/file"
    "github.com/foomo/goencode/gzip"
    "github.com/foomo/goencode/json/v1"
)

type Config struct {
    Host string `json:"host"`
    Port int    `json:"port"`
}

func main() {
    fc := file.NewCodec[Config](
        gzip.NewCodec[Config](json.NewCodec[Config]()),
        file.WithPermissions(0o600),
    )

    cfg := Config{Host: "localhost", Port: 8080}

    // Write atomically: JSON → gzip → temp file → rename
    if err := fc.Encode("/tmp/config.json.gz", cfg); err != nil {
        log.Fatal(err)
    }

    // Read back: file → gunzip → JSON
    var loaded Config
    if err := fc.Decode("/tmp/config.json.gz", &loaded); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Host: %s, Port: %d\n", loaded.Host, loaded.Port)
}