【问题标题】:Function collisions in GoGo 中的函数冲突
【发布时间】:2009-11-13 21:02:20
【问题描述】:

Golang Initialization 描述了一种在 Go 编程语言中将方法附加到任意对象的方法。例如,他们为新定义的ByteSize 类型展示了String 方法:

type ByteSize float64
const (
    _ = iota;   // ignore first value by assigning to blank identifier
    KB ByteSize = 1<<(10*iota);
    MB;
    GB;
    TB;
    PB;
    YB;
)

将诸如 String 之类的方法附加到类型的能力使得这些值可以自动格式化以进行打印,甚至作为通用类型的一部分。

func (b ByteSize) String() string {
    switch {
    case b >= YB:
        return fmt.Sprintf("%.2fYB", b/YB)
    case b >= PB:
        return fmt.Sprintf("%.2fPB", b/PB)
    case b >= TB:
        return fmt.Sprintf("%.2fTB", b/TB)
    case b >= GB:
        return fmt.Sprintf("%.2fGB", b/GB)
    case b >= MB:
        return fmt.Sprintf("%.2fMB", b/MB)
    case b >= KB:
        return fmt.Sprintf("%.2fKB", b/KB)
    }
    return fmt.Sprintf("%.2fB", b)
}

我不清楚的是:如果ByteSizefunc (b ByteSize) String() string 都定义在某个包中,我导入该包但想通过使用我自己的字符串方法编写来自定义ByteSize 的显示, Go 如何知道是调用我自己的字符串方法还是之前定义的字符串方法?甚至可以重新定义字符串吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    如果你想在一个类型上添加新方法,目的是让你包装一个类型,所以你要定义

    type MyByteSize ByteSize
    func (b MyByteSize) String() string{
    
    }
    

    您不能在我相信它定义的模块之外的类型上定义方法。

    【讨论】:

    • 对。其他语言通过覆盖子类上的方法来解决同样的问题。但是在 Go 中,您的优势在于对象本身不必是新类型。您可以从任何地方获取 ByteSize,将其保存到 MyByteSize 类型的变量中,然后使用您自己的方法。
    • 另外,ByteSize 和 MyByteSize 之间的转换是免费的,因为内部表示是相同的。
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多