]> Cypherpunks repositories - gostls13.git/commitdiff
If a value implements String(), use that in fmt.print (not fmt.printf)
authorRob Pike <r@golang.org>
Thu, 6 Nov 2008 19:38:44 +0000 (11:38 -0800)
committerRob Pike <r@golang.org>
Thu, 6 Nov 2008 19:38:44 +0000 (11:38 -0800)
R=rsc
DELTA=13  (9 added, 0 deleted, 4 changed)
OCL=18682
CL=18684

src/lib/fmt/print.go

index 3c237f5e32e0838fa27aa4666079bab7aaa47a03..3516b19ab9f16533b27a367b9f067731d228f859 100644 (file)
@@ -22,14 +22,18 @@ export type Writer interface {
 // Representation of printer state passed to custom formatters.
 // Provides access to the Writer interface plus information about
 // the active formatting verb.
-export type FormatHelper interface {
+export type Formatter interface {
        Write(b *[]byte) (ret int, err *os.Error);
        Width() (wid int, ok bool);
        Precision()     (prec int, ok bool);
 }
 
-export type Formatter interface {
-       Format(f FormatHelper, c int);
+export type Format interface {
+       Format(f Formatter, c int);
+}
+
+export type String interface {
+       String() string
 }
 
 const Runeself = 0x80
@@ -303,7 +307,7 @@ func (p *P) doprintf(format string, v reflect.StructValue) {
                }
                field := v.Field(fieldnum);
                fieldnum++;
-               if formatter, ok := field.Interface().(Formatter); ok {
+               if formatter, ok := field.Interface().(Format); ok {
                        formatter.Format(p, c);
                        continue;
                }
@@ -439,6 +443,11 @@ func (p *P) doprint(v reflect.StructValue, addspace, addnewline bool) {
                                p.add(' ')
                        }
                }
+               if stringer, ok := field.Interface().(String); ok {
+                       p.addstr(stringer.String());
+                       prev_string = false;    // this value is not a string
+                       continue;
+               }
                switch field.Kind() {
                case reflect.BoolKind:
                        s = p.fmt.boolean(field.(reflect.BoolValue).Get()).str();