10 // StringValue returns the string representation of a value.
11 func StringValue(i interface{}) string {
13 stringValue(reflect.ValueOf(i), 0, &buf)
17 func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) {
18 for v.Kind() == reflect.Ptr {
24 buf.WriteString("{\n")
27 for i := 0; i < v.Type().NumField(); i++ {
28 name := v.Type().Field(i).Name
30 if name[0:1] == strings.ToLower(name[0:1]) {
31 continue // ignore unexported fields
33 if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice) && f.IsNil() {
34 continue // ignore unset fields
36 names = append(names, name)
39 for i, n := range names {
40 val := v.FieldByName(n)
41 buf.WriteString(strings.Repeat(" ", indent+2))
42 buf.WriteString(n + ": ")
43 stringValue(val, indent+2, buf)
46 buf.WriteString(",\n")
50 buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
52 nl, id, id2 := "", "", ""
54 nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2)
56 buf.WriteString("[" + nl)
57 for i := 0; i < v.Len(); i++ {
59 stringValue(v.Index(i), indent+2, buf)
62 buf.WriteString("," + nl)
66 buf.WriteString(nl + id + "]")
68 buf.WriteString("{\n")
70 for i, k := range v.MapKeys() {
71 buf.WriteString(strings.Repeat(" ", indent+2))
72 buf.WriteString(k.String() + ": ")
73 stringValue(v.MapIndex(k), indent+2, buf)
76 buf.WriteString(",\n")
80 buf.WriteString("\n" + strings.Repeat(" ", indent) + "}")
83 switch v.Interface().(type) {
87 fmt.Fprintf(buf, format, v.Interface())