1
0
mirror of https://github.com/golang/go synced 2024-11-18 10:44:45 -07:00

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>
This commit is contained in:
Martin Möhrmann 2016-10-09 21:06:03 +02:00 committed by Martin Möhrmann
parent faf882d1d4
commit 2ecaaf18f9
2 changed files with 12 additions and 1 deletions

View File

@ -605,7 +605,10 @@ var fmtTests = []struct {
{"%x", I(23), `3c32333e`}, {"%x", I(23), `3c32333e`},
{"%#x", I(23), `0x3c32333e`}, {"%#x", I(23), `0x3c32333e`},
{"%# x", I(23), `0x3c 0x32 0x33 0x3e`}, {"%# 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 // go syntax
{"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`}, {"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`},

View File

@ -659,6 +659,14 @@ func (p *pp) printArg(arg interface{}, verb rune) {
case []byte: case []byte:
p.fmtBytes(f, verb, "[]byte") p.fmtBytes(f, verb, "[]byte")
case reflect.Value: 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) p.printValue(f, verb, 0)
default: default:
// If the type is not simple, it might have methods. // If the type is not simple, it might have methods.