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

package main


type 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),或其他什么?


慕哥9229398
浏览 174回答 1
1回答

当年话下

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()和亲戚)进行检查。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go