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

rpk*_*amp 1 string type-conversion go

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)
}
Run Code Online (Sandbox Code Playgroud)

这输出main.go:14: cannot convert f (type foo) to type string

因此,将某些内容强制转换为字符串似乎并不关注stinger接口。我的猜测是,这是因为强制转换是在比Stringer接口更低的级别上实现的,并且不可能/很难将两者混合使用,但是我不确定。谁能对此有所启示?

另外,由于这是不可能的,在这种情况下,将结构转换为字符串的惯用方式是什么?我只是称呼.String()自己,还是fmt.Sprintf("%s", f),还是其他?

icz*_*cza 5

Go中没有强制转换类型转换类型断言

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

对于与字符串类型之间的转换有特定的规则。因此,类型转换无法实现您想要的功能。

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

v := f.String()
Run Code Online (Sandbox Code Playgroud)

fmt.Sprintf()如果您struct已经实现的话,那只会是不必要的开销和复杂性Stringer。但是,如果您对此没有保证,那是fmt.Sprintf()一般的方法。

你可以问为什么?

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

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