]> Cypherpunks repositories - gostls13.git/commitdiff
print array (not just *array) using %v
authorRob Pike <r@golang.org>
Mon, 22 Dec 2008 19:04:17 +0000 (11:04 -0800)
committerRob Pike <r@golang.org>
Mon, 22 Dec 2008 19:04:17 +0000 (11:04 -0800)
TBR=rsc
DELTA=34  (33 added, 0 deleted, 1 changed)
OCL=21718
CL=21718

src/lib/fmt/fmt_test.go
src/lib/fmt/print.go

index 20539df62638e8ea330ca943506a9328f37c0596..5b016ca4c2a8c0155bec5bc09e3daa715578d70f 100644 (file)
@@ -232,3 +232,17 @@ export func TestStructPrinter(t *testing.T) {
                }
        }
 }
+
+export func TestArrayPrinter(t *testing.T) {
+       a := []int{1, 2, 3, 4, 5};
+       want := "[1 2 3 4 5]";
+       out := fmt.sprintf("%v", a);
+       if out != want {
+               t.Errorf("sprintf(%%v, array) = %q, want %q", out, want);
+       }
+       want = "&" + want;
+       out = fmt.sprintf("%v", &a);
+       if out != want {
+               t.Errorf("sprintf(%%v, &array) = %q, want %q", out, want);
+       }
+}
index bb69ba4200f39a480683c225914c56ddac8d8987..6546e13afc93d5f716d0b233b9b3eb4f4ced9fcf 100644 (file)
@@ -305,6 +305,14 @@ func getArrayPtr(v reflect.Value) (val reflect.ArrayValue, ok bool) {
        return nil, false;
 }
 
+func getArray(v reflect.Value) (val reflect.ArrayValue, ok bool) {
+       switch v.Kind() {
+       case reflect.ArrayKind:
+               return v.(reflect.ArrayValue), true;
+       }
+       return nil, false;
+}
+
 // Convert ASCII to integer.  n is 0 (and got is false) if no number present.
 
 func parsenum(s string, start, end int) (n int, got bool, newi int) {
@@ -365,7 +373,7 @@ func (p *P) printField(field reflect.Value) (was_string bool) {
                if v, ok := getPtr(field); v == 0 {
                        s = "<nil>"
                } else {
-                       // pointer to array?
+                       // pointer to array?  (TODO(r): holdover; delete?)
                        if a, ok := getArrayPtr(field); ok {
                                p.addstr("&[");
                                for i := 0; i < a.Len(); i++ {
@@ -380,6 +388,17 @@ func (p *P) printField(field reflect.Value) (was_string bool) {
                                s = p.fmt.uX64(uint64(v)).str();
                        }
                }
+       case reflect.ArrayKind:
+               if a, ok := getArray(field); ok {
+                       p.addstr("[");
+                       for i := 0; i < a.Len(); i++ {
+                               if i > 0 {
+                                       p.addstr(" ");
+                               }
+                               p.printField(a.Elem(i));
+                       }
+                       p.addstr("]");
+               }
        case reflect.StructKind:
                p.add('{');
                v := field.(reflect.StructValue);