如何为自定义类型定义将类型转换为字符串的方法

时间:2019-11-21 10:55:17

标签: string go type-conversion

我可以定义使用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

1 个答案:

答案 0 :(得分:3)

  

我可以定义使用string()到字符串的转换如何应用于我的自定义类型myint吗?以及如何做?

否,您不能“替代”转换行为。它记录在Spec: Conversions中,到此为止。 String()方法适用于fmt包,因为编写了fmt包以显式检查String() string方法的存在。转化无法做到这一点。

如果您需要自定义转换行为,请不要使用转换,而是在方法(或函数)中实现逻辑,然后调用这些方法(或函数)。

因此在您的示例中,您将编写:

mystr := "Testing: " + val.String()

您将获得预期的输出(在Go Playground上尝试):

Testing: 42 42