«

Go语言中自定义类型方法的策略:包装与扩展

磁力搜索 • 1 天前 • 3 次点击 • 资讯分享


Go语言中自定义类型方法的策略:包装与扩展

在Go语言中,为现有类型附加方法是一种强大的机制,它使得类型能够自定义其行为,例如通过实现 fmt.Stringer 接口的 String() 方法来自定义打印输出。然而,当我们需要对来自外部包的类型进行方法定制时,例如修改其 String() 方法的输出格式,问题就出现了:Go语言是否允许我们直接重定义这些方法?如果允许,Go又如何区分调用我们自定义的方法还是原始方法?

Go语言方法绑定的原则:不可重定义性

go语言的设计哲学之一是简洁性和明确性。在方法绑定方面,go遵循严格的规则:方法是绑定到其声明的类型和包的。 这意味着一旦一个方法(如 string())被定义在某个类型(如 bytesize)上,并且该类型及其方法在一个包中被导出,其他包就无法直接“重写”或“重定义”这个方法。

考虑以下 ByteSize 类型的定义及其 String() 方法:

package mytypes

import "fmt"

type ByteSize float64

const (
    _ = iota
    KB ByteSize = 1 << (10 * iota)
    MB
    GB
    TB
    PB
    YB
)

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)
}
登录后复制


    还没收到回复