print array (not just *array) using %v
TBR=rsc
DELTA=34 (33 added, 0 deleted, 1 changed)
OCL=21718
CL=21718
diff --git a/src/lib/fmt/fmt_test.go b/src/lib/fmt/fmt_test.go
index 20539df..5b016ca 100644
--- a/src/lib/fmt/fmt_test.go
+++ b/src/lib/fmt/fmt_test.go
@@ -232,3 +232,17 @@
}
}
}
+
+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);
+ }
+}
diff --git a/src/lib/fmt/print.go b/src/lib/fmt/print.go
index bb69ba4..6546e13 100644
--- a/src/lib/fmt/print.go
+++ b/src/lib/fmt/print.go
@@ -305,6 +305,14 @@
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 @@
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 @@
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);