func fomateinfo(headlen int, data ...interface{}) []byte {
	var buf = new(bytes.Buffer)
	if len(data) > 1 {
		fmt.Fprint(buf, "    ")
		fmt.Fprint(buf, "[")
		fmt.Fprintln(buf)
	}
	for k, v := range data {
		var buf2 = new(bytes.Buffer)
		var pointers *pointerInfo
		var interfaces = make([]reflect.Value, 0, 10)
		printKeyValue(buf2, reflect.ValueOf(v), &pointers, &interfaces, nil, true, "    ", 1)
		if k < len(data)-1 {
			fmt.Fprint(buf2, ", ")
		}
		fmt.Fprintln(buf2)
		buf.Write(buf2.Bytes())
	}
	if len(data) > 1 {
		fmt.Fprintln(buf)
		fmt.Fprint(buf, "    ")
		fmt.Fprint(buf, "]")
	}
	return buf.Bytes()
}
return data dump and format bytes
package utils
import (
	"bytes"
	"fmt"
	"log"
	"reflect"
	"runtime"
)
var (
	dunno     = []byte("???")
	centerDot = []byte("·")
	dot       = []byte(".")
)
type pointerInfo struct {
	prev *pointerInfo
	n    int
	addr uintptr
	pos  int
	used []int
}
func Display(data ...interface{}) {
	display(true, data...)
}
func GetDisplayString(data ...interface{}) string {
	return display(false, data...)
}
func display(displayed bool, data ...interface{}) string {
	var pc, file, line, ok = runtime.Caller(2)
	if !ok {
		return ""
	}
	var buf = new(bytes.Buffer)
	fmt.Fprintf(buf, "[Debug] at %s() [%s:%d]\n", function(pc), file, line)
	fmt.Fprintf(buf, "\n[Variables]\n")
	for i := 0; i < len(data); i += 2 {
		var output = fomateinfo(len(data[i].(string))+3, data[i+1])
		fmt.Fprintf(buf, "%s = %s", data[i], output)
	}
	if displayed {
		log.Print(buf)
	}
	return buf.String()
}