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 中没有强制转换,有类型Conversion和Type 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()
和亲戚)进行检查。
- 1 回答
- 0 关注
- 173 浏览
添加回答
举报
0/150
提交
取消