aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Möhrmann <martisch@uos.de>2016-10-09 21:06:03 +0200
committerMartin Möhrmann <martisch@uos.de>2016-10-18 10:50:26 +0000
commit2ecaaf18f94cd5ad3ccd46937d36c7a68d3e69bf (patch)
treec21a608bf0066253d3aa403d2bc293b320a9a362 /src
parentfaf882d1d427e8c8a9a1be00d8ddcab81d1e848e (diff)
downloadgo-2ecaaf18f94cd5ad3ccd46937d36c7a68d3e69bf.tar.xz
fmt: always handle special methods if print operand is a reflect.Value
Check for and call the special printing and format methods such as String at printing depth 0 when printing the concrete value of a reflect.Value. Fixes: #16015 Change-Id: I23bd2927255b60924e5558321e98dd4a95e11c4c Reviewed-on: https://go-review.googlesource.com/30753 Reviewed-by: Russ Cox <rsc@golang.org> Run-TryBot: Martin Möhrmann <martisch@uos.de> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/fmt/fmt_test.go5
-rw-r--r--src/fmt/print.go8
2 files changed, 12 insertions, 1 deletions
diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go
index 8c1c02158e..6f8c1550a0 100644
--- a/src/fmt/fmt_test.go
+++ b/src/fmt/fmt_test.go
@@ -605,7 +605,10 @@ var fmtTests = []struct {
{"%x", I(23), `3c32333e`},
{"%#x", I(23), `0x3c32333e`},
{"%# x", I(23), `0x3c 0x32 0x33 0x3e`},
- {"%d", I(23), `23`}, // Stringer applies only to string formats.
+ // Stringer applies only to string formats.
+ {"%d", I(23), `23`},
+ // Stringer applies to the extracted value.
+ {"%s", reflect.ValueOf(I(23)), `<23>`},
// go syntax
{"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`},
diff --git a/src/fmt/print.go b/src/fmt/print.go
index f8c731656e..75301a238e 100644
--- a/src/fmt/print.go
+++ b/src/fmt/print.go
@@ -659,6 +659,14 @@ func (p *pp) printArg(arg interface{}, verb rune) {
case []byte:
p.fmtBytes(f, verb, "[]byte")
case reflect.Value:
+ // Handle extractable values with special methods
+ // since printValue does not handle them at depth 0.
+ if f.IsValid() && f.CanInterface() {
+ p.arg = f.Interface()
+ if p.handleMethods(verb) {
+ return
+ }
+ }
p.printValue(f, verb, 0)
default:
// If the type is not simple, it might have methods.