为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,为什么在转换为字符串时不使用 stringer 接口?

在 Go 中,为什么在转换为字符串时不使用 stringer 接口?

Go
慕哥9229398 2021-09-27 15:34:32
package maintype foo struct {    bar string    baz string}func (f foo) String() string {    return f.bar + " " + f.baz}func main() {    f := foo{"hello", "world"}    v := string(f)}这输出main.go:14: cannot convert f (type foo) to type string.因此,将某些内容转换为字符串似乎并不看毒刺接口。我的猜测是,这是因为转换是在比 stringer 接口更低的级别上实现的,并且不可能/难以混合两者,但我不确定。任何人都可以对此有所了解吗?此外,由于这是不可能的,在这种情况下,将我的结构转换为字符串的惯用方法是什么?我只是称呼.String()自己,还是fmt.Sprintf("%s", f),或其他什么?
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

Go 中没有强制转换,有类型ConversionType assertion

你正在做的 ( T(Expression)) 是一个转换,它有严格的规则何时可以使用以及结果是什么。

有一些特定规则适用于与字符串类型之间的转换。所以你想要的东西不能通过类型转换来实现。

最简单和首选的方法是自己调用该方法:

v := f.String()

fmt.Sprintf()如果您struct已经实现了Stringer. 但是,如果您对此没有保证,那么是的,fmt.Sprintf()这将是一般方法。

你可以问为什么?

在规范级别,类型转换表达式未定义为自定义/用户制作的函数或方法的结果。与Stringer接口相比,接口 ( type Stringer interface{String() string}) 甚至不是内置类型error

但是尽管它Stringer不是内置类型,但它仍然存在于某些包中(例如 in fmt.Stringer)并通过各种方法或函数(例如fmt.Printf()和亲戚)进行检查。


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信