gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:52:58 27 4
gpt4 key购买 nike

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

因此,将某些内容转换为字符串似乎不会查看 stinger 接口(interface)。我的猜测是,这是因为转换是在比纵梁接口(interface)更低的级别上实现的,并且不可能/很难将两者混合使用,但我不确定。任何人都可以阐明这一点吗?

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

最佳答案

Go 中没有casting,有类型 ConversionType assertion

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

有适用于 Conversions to and from a string type 的特定规则。所以你想要的是类型转换无法实现的。

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

v := f.String()
如果您的 struct 已经实现了 Stringer

fmt.Sprintf() 只是不必要的开销和复杂化。但是,如果您对此没有保证,那么是的,fmt.Sprintf() 将是通用方法。

你可以问为什么?

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

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

关于string - 在 Go 中,为什么在转换为字符串时不使用 stringer 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29342776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com