- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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,有类型 Conversion 和 Type 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/
Go 新手,所以请多多包涵。 我一直在查看“围棋之旅”页面,无意中发现了一些关于 Stringer 的令人费解的东西。考虑 https://tour.golang.org/methods/18 处的练
The Go FAQ answers a question关于方法中按值与按指针接收器定义的选择。该答案中的陈述之一是: If some of the methods of the type must
对于 Go 之旅中的 Stringers 练习:对于两种不同格式的打印,我得到了两种不同的输出。我唯一改变的是格式动词。他们是 %v 和 %d。理论上,它们会给出相同的输出。但是输出的顺序也改变了,这
我正在尝试使用 go generate/stringer (golang.org/x/tools/cmd/stringer) 在枚举上生成 String() 方法。我有问题,我认为是因为不同系统上的
知道如何修复下面的错误吗?我有一个 go 生成器 (stringer),我尝试运行它,但它一直报告说它找不到包导入,尽管包肯定是导入的。 stringer: checking package: mai
这个问题在这里已经有了答案: Can I type assert a slice of interface values? (2 个答案) 关闭 3 年前。 我有一个实现 stringer 接口(i
这个问题在这里已经有了答案: Why isn't my Stringer interface method getting invoked? When using fmt.Println (6 个答
我需要以这种格式将数据发送到数据库 - {"param1":"value1", "param2":"value2", "param3": {"username": "admin", "password
我正在完成 golang 之旅,但我被困在其中一个练习中。我不确定为什么以下内容不适用于 String() 函数: type IPAddr [4]byte func (addr IPAddr) Str
与 fmt.Stringer 一样, fmt 包寻找 error interface打印值时。如果一个type满足这两个接口(interface),fmt 仅在查找 error 而不是 Stringe
我可以实现 Stringer 来指定 fmt.Print() 如何将我的自定义类型写入字符串。 json marshal 有等效项吗? 我想在 go 中存储唯一值,并在 json 中将其表示为一个 s
这个问题在这里已经有了答案: puzzling behavior for Stringers? (2 个答案) 关闭 4 年前。 全部: 只是一个简单的问题: 围棋教程中 https://tour.
我有一个这样的结构: .foo/bar/constants.go .foo/constants.go .main.go 在 main.go 中声明类型: package agepack type Ev
我正在尝试使用 stringer cmd 以便我可以为某些 int 类型生成 String() 方法。这是代码的样子 //go:generate stringer -type=MyIntType ty
我想重写所有实例 sql.NullString 的 Stringer 接口(interface),以便实例的输出是 instance.String 而不是 { instance.String, ins
刚接触 Golang。所以我在 Go 之旅中读到了关于 stringer 的内容,我想知道是否有任何方法可以为任何类型的 slice 定义一个通用的自定义 Stringer()?例如: package
package main type foo struct { bar string baz string } func (f foo) String() string { re
假设我有以下代码: package main import "fmt" type Car struct{ year int make string } func (c *Car)Str
我是一名优秀的程序员,十分优秀!