【问题标题】:How to define type conversion to string for a custom type如何为自定义类型定义类型转换为字符串
【发布时间】:2020-03-17 06:53:23
【问题描述】:

我能否定义如何使用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

【问题讨论】:

  • “我期待 [...]”。语言规范或围棋之旅的哪一部分让您期待这一点?
  • @Volker 这是一种直觉,因为我认为string() 会使用与fmt.Println() 相同的机制,这次巡演让我认为纵梁比实际情况更重要...... Python 也有这种行为。
  • 构造string(x) 不是函数调用而是类型转换,因为string 不是函数而是类型。

标签: string go type-conversion


【解决方案1】:

我能否定义如何将使用string() 的字符串转换应用于我的自定义类型myint?以及如何做到这一点?

不,您不能“覆盖”转换行为。记录在Spec: Conversions,到此结束。 String() 方法适用于 fmt 包,因为编写 fmt 包是为了显式检查 String() string 方法的存在。转化不会那样做。

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

所以在你的例子中你会写:

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

你会得到你预期的输出(在Go Playground上试试):

Testing: 42 42

【讨论】:

猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2018-02-04
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多