我可以定义使用String()
到字符串的转换如何应用于我的自定义类型myint
吗?以及如何做?
我期望定义方法String()
足够,因为fmt.Println()
使用了它,但string()
显然没有。当我学习Go时,这纯粹是一个理论问题,对此行为感到惊讶。
以下是显示行为的示例:
package main
import (
"fmt"
)
type myint int
func (m myint) String() string {
return fmt.Sprintf("%d", m)
}
func main() {
var val myint = 42
mystr := "Testing: " + string(val)
fmt.Println(mystr, val)
}
哪个输出:
测试:* 42
但是我期待着:
测试:42 42
答案 0 :(得分:3)
我可以定义使用
string()
到字符串的转换如何应用于我的自定义类型myint
吗?以及如何做?
否,您不能“替代”转换行为。它记录在Spec: Conversions中,到此为止。 String()
方法适用于fmt
包,因为编写了fmt
包以显式检查String() string
方法的存在。转化无法做到这一点。
如果您需要自定义转换行为,请不要使用转换,而是在方法(或函数)中实现逻辑,然后调用这些方法(或函数)。
因此在您的示例中,您将编写:
mystr := "Testing: " + val.String()
您将获得预期的输出(在Go Playground上尝试):
Testing: 42 42