Files
gf/g/util/gutil/gutil.go

68 lines
2.0 KiB
Go
Raw Normal View History

2017-12-29 16:03:30 +08:00
// Copyright 2017 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://gitee.com/johng/gf.
2018-01-03 10:38:53 +08:00
// 其他工具包
2017-11-23 10:21:28 +08:00
package gutil
import (
"fmt"
"bytes"
"encoding/json"
"reflect"
"gitee.com/johng/gf/g/util/gconv"
"runtime"
"gitee.com/johng/gf/g/os/glog"
)
// 格式化打印变量(类似于PHP-vardump)
func Dump(i...interface{}) {
for _, v := range i {
if b, ok := v.([]byte); ok {
fmt.Print(string(b))
} else {
// 主要针对 map[interface{}]* 进行处理json无法进行encode
// 这里强制对所有map进行反射处理转换
refValue := reflect.ValueOf(v)
if refValue.Kind() == reflect.Map {
m := make(map[string]interface{})
keys := refValue.MapKeys()
for _, k := range keys {
key := gconv.String(k.Interface())
m[key] = refValue.MapIndex(k).Interface()
}
v = m
}
// json encode并打印到终端
buffer := &bytes.Buffer{}
encoder := json.NewEncoder(buffer)
encoder.SetEscapeHTML(false)
encoder.SetIndent("", "\t")
if err := encoder.Encode(v); err == nil {
fmt.Print(buffer.String())
} else {
fmt.Errorf("%s", err.Error())
}
}
2018-09-17 09:52:24 +08:00
//fmt.Println()
}
}
// 打印完整的调用回溯信息
func PrintBacktrace() {
index := 1
buffer := bytes.NewBuffer(nil)
for i := 0; i < 10000; i++ {
if _, cfile, cline, ok := runtime.Caller(i); ok {
buffer.WriteString(fmt.Sprintf(`%d. %s:%d%s`, index, cfile, cline, "\n"))
index++
} else {
break
}
}
glog.Header(false).Print(buffer.String())
}