Golang中如何将自定义类型转换为字符串
Golang中如何将自定义类型转换为字符串 大家好,
我实在是不明白为什么 fmt.Println("hahoooExecuting SXtring() for CustomType!") 会被执行……
看起来,String() 方法不知怎么就被调用了……但这是为什么呢?我尝试查看了 Println 的文档,想看看是否有任何实现使用了自定义字符串作为接收器,但我没有发现……我到底漏掉了什么?请给我指点一下正确的方向,我本以为我开始理解 Go 语言了,但这完全把我搞糊涂了,让我卡在这里……请帮帮我。我非常渴望理解这一点。
package main
import (
"fmt"
)
type CustomType string
const (
Foobar CustomType = "somestring"
)
func main() {
fmt.Println("1")
fmt.Println(Foobar, Foobar, "Hello, playground", Foobar)
fmt.Println("2")
//fmt.Printf("%s", Foobar)
//fmt.Println("\n\n")
//fmt.Println(SomeFunction())
}
func (c CustomType) String() string {
fmt.Println("hahoooExecuting SXtring() for CustomType!")
return string(c)
}
//func SomeFunction() string {
// return Foobar.String()
//}
更多关于Golang中如何将自定义类型转换为字符串的实战教程也可以访问 https://www.itying.com/category-94-b0.html
askingquestionsagain:
我在文档中没有看到这一点
文档中确实有。
petrus:
type StringerString 方法用于打印作为操作数传递给任何接受字符串的格式或传递给诸如 Print 之类的无格式打印器的值。
petrus:
任何具有
String方法的类型都可以实现该接口,该方法定义了该值的“原生”格式。String方法用于打印传递的值。
感谢您的解答,这对我帮助很大。然而,即使了解了这一点,我仍然无法理解为什么 Println 会使用 String 方法……我在文档中没有看到这一点。
我刚才尝试了下面的代码,想验证我脑海中关于字符串的理论是否正确,结果发现并非如此……(我不知为何认为因为返回类型是字符串,所以它会匹配)
type Person struct {
Age int
}
func (p Person) String() string {
fmt.Println("this is crazy")
return fmt.Sprintf(" (%v years)", p.Age)
}
func main() {
a := Person{ 42}
z := Person{9001}
fmt.Println(a, z)
}
petrus:
ed to pri
我继续阅读文档,但仍然不清楚(这不是你的错 @petrus)……这只是我对 Go 语言理解不足,但这快把我逼疯了。
我理解 Stringer 是一个接口,任何实现了 String 函数的类型都符合条件……但我不明白像 fmt.Println 这样的打印函数是如何实现 func String() 的。文档里哪里提到了这一点?在这个特定的例子中,是因为类型是 string 并且匹配了 Stringer 接口定义中的 "String() string" 部分吗?
askingquestionsagain:
我真的真的不明白
去学习一下 Go 语言之旅。特别是 Stringers 这一节。
askingquestionsagain:
我尝试查看 Println 的文档,想看看是否有任何东西实现了它们,并使用自定义字符串作为接收器,但我没有看到任何相关内容……
type Stringer任何拥有 String 方法的类型都实现了 Stringer 接口,该方法定义了该值的“原生”格式。String 方法用于打印作为操作数传递给任何接受字符串的格式说明符的值,或者传递给诸如 Print 这样的无格式打印机。
type Stringer interface {
String() string
}
遵循文档:
Stringer接口由任何拥有String方法的类型实现,该方法定义了该值的“原生”格式。String方法用于打印作为操作数传递给任何接受字符串的格式化指令的值,或传递给诸如Print这样的非格式化打印器。
type Stringer interface {
String() string
}
fmt.Println是一个非格式化打印器。Person类型满足Stringer接口,它拥有一个String() string方法。因此,fmt会调用接收者为Person的String()方法,以返回用于任何Println类型Person操作数(参数)的待打印字符串。
package main
import "fmt"
type Person struct {
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%v years old", p.Age)
}
func main() {
p := Person{42}
fmt.Println(p)
}

Go Playground - The Go Programming Language
42 years old
在Go语言中,当自定义类型实现了String() string方法时,fmt包中的打印函数(如fmt.Println、fmt.Printf等)会自动调用该方法来获取字符串表示。这是Go语言接口的隐式实现机制。
在你的代码中,CustomType类型实现了String()方法。当调用fmt.Println(Foobar)时,fmt包会检查Foobar是否实现了Stringer接口(该接口只包含String() string方法)。由于CustomType实现了这个方法,所以fmt.Println会自动调用它。
以下是代码示例,展示了String()方法如何被隐式调用:
package main
import (
"fmt"
)
type CustomType string
const (
Foobar CustomType = "somestring"
)
func main() {
// 当打印Foobar时,fmt.Println会检查Foobar是否实现了Stringer接口
// 由于CustomType实现了String()方法,所以会自动调用
fmt.Println(Foobar) // 这会触发String()方法的执行
// 显式调用String()方法
fmt.Println(Foobar.String())
// 使用类型转换避免调用String()方法
fmt.Println(string(Foobar))
}
func (c CustomType) String() string {
fmt.Println("hahoooExecuting String() for CustomType!")
return string(c)
}
输出结果:
hahoooExecuting String() for CustomType!
somestring
hahoooExecuting String() for CustomType!
somestring
somestring
如果你不希望String()方法被自动调用,可以通过类型转换将其转换为底层类型:
fmt.Println(string(Foobar)) // 不会调用String()方法
或者实现一个不同的方法名:
func (c CustomType) ToString() string {
return string(c)
}
这样fmt.Println就不会自动调用它了。

