From: Rob Pike Date: Thu, 6 Nov 2008 19:38:44 +0000 (-0800) Subject: If a value implements String(), use that in fmt.print (not fmt.printf) X-Git-Tag: weekly.2009-11-06~2779 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=91212bd1ad81d30425bdb0b0f5d813369490c9bb;p=gostls13.git If a value implements String(), use that in fmt.print (not fmt.printf) R=rsc DELTA=13 (9 added, 0 deleted, 4 changed) OCL=18682 CL=18684 --- diff --git a/src/lib/fmt/print.go b/src/lib/fmt/print.go index 3c237f5e32..3516b19ab9 100644 --- a/src/lib/fmt/print.go +++ b/src/lib/fmt/print.go @@ -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();