打印围棋类型忽略“字符串()字符串”方法
问题描述:
如果我有这样的旅途中类型:打印围棋类型忽略“字符串()字符串”方法
type myType ...
func (m myType) String() string { ... }
我怎么能打印(使用各种fmt
功能)这类使用默认的表示(那就是,而不是叫String()
)?我想要做的是这样的:
func (m myType) String() string {
// some arbitrary property
if myType.isValid() {
// format properly
} else {
// will recurse infinitely; would like default
// representation instead
return fmt.Sprintf("invalid myType: %v", m)
}
}
答
fmt.Stringer
是默认格式,当您使用%v
时会调用该格式。如果您需要Go语法,请使用%#v
。
或者,您可以完全绕过fmt
中的反射,并按照您认为合适的方式格式化输出。
func (m myType) String() string {
return fmt.Sprintf("{Field: %s}", m.Value)
}
如果基础类型的myType的是一个数字,字符串或其它简单的类型,然后在打印时转换为基本类型:
func (m mType) String() string {
return fmt.Sprint(int(m))
}
答
使用%#v
格式不正确的答案,如果你想让您的基础类型的String
工作或您的类型是一个类型别名。
正如在Effective Go解释,只是将其转换回它所代表的类型:
type Foo int
func (f Foo) String() string {
if f == 0 {
return "foo"
}
return fmt.Sprintf("%v", int(f)) // N.B.
}
func main() {
fmt.Println(Foo(0))
fmt.Println(Foo(42))
}
编辑:正如其他人在评论中所指出的那样,如果你的类型是一个结构,使用%#v
格式好像除了将其转换为匿名结构类型与同一领域的唯一途径。
这是Effective Go中的内容。 OP应该将该值转换为基础类型,然后使用'%v'格式。看到我的答案。 – 2014-09-24 14:52:01
@ Ainar-G对于类型别名,您的答案很简单,但对于例如'输入myType struct {myOtherType}'。 Effective Go中似乎也没有任何内容表明%#v不是OP想要的。 – nos 2014-09-24 15:09:24
你是对的,编辑我的答案。 – 2014-09-24 15:18:11