Skip to content

helloyi/gotable

Repository files navigation

The Table in go

GoDoc Build Status Coverage Status Go Report Card stability-unstable License

Put 'interface{}' on the Table, and to unfold, then, manipulates interface{} value, convenient and simple.

Usage

Pick up some value from interface{}.

package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"

	"github.com/helloyi/gotable"
)

func main() {
	resp, err := http.Get("https://api.alternative.me/fng/?limit=10")
	if err != nil {
		log.Fatalln(err)
	}
	defer resp.Body.Close()

	data, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln(err)
	}

	var res interface{}
	if err := json.Unmarshal(data, &res); err != nil {
		log.Fatalln(err)
	}

	rest := table.New(res)

	fngs := map[string]string{}
	_ = rest.MustGet("data").EachDo(func(_, fng *table.Table) error {
		ts := fng.MustGet("timestamp").String()
		val := fng.MustGet("value").String()
		fngs[ts] = val
		return nil
	})

	data, err = json.MarshalIndent(fngs, "", "  ")
	if err != nil {
		log.Fatalln(err)
	}
	log.Println(string(data))
}

For a map:

package main

import (
	"github.com/helloyi/gotable"
	"log"
)

func main() {
	var m interface {} = map[int]int{
		1: 1,
		2: 2,
	}
	t := table.New(m)

	sum := 0
	if err := t.EachDo(func(k, v *table.Table) error {
		sum += v.MustInt()
		return nil
	}); err != nil {
		log.Fatalln(err)
	}

	log.Println(sum) // print 3
}

Convert to struct

package main

import (
	"fmt"
	"log"

	"github.com/helloyi/gotable"
)


func main() {
	x := map[string]interface{}{
		"a": 1,
		"A": 11,

		"B": "b",
		"b": "bb",

		"C": "c",
		"c": "cc",
	}

	var y struct {
		A int    `table:"a"` // set with name "a"
		B string `table:"_"` // passed
		C string // set with name "C"
	}

	t := table.New(x)
	if err := t.Conv(&y); err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("%+v\n", y)
}

Set map key:

package main

import (
	"github.com/helloyi/gotable"
	"log"
)

func main() {
  var m interface {} = map[int]int{
		1: 1,
		2: 2,
	}
	t := table.New(m)

	if err := t.Put(1, 100); err != nil {
		log.Fatalln(err)
	}

	log.Println(t.MustGet(1).MustInt()) // print 100
}

About

Manipulates(gets,sets,convert etc.) interface{} value, convenient and simple, and reflect-based.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages