首页 >后端开发 >Golang >为什么直接类型别名不继承 Go 中的方法?

为什么直接类型别名不继承 Go 中的方法?

Linda Hamilton
Linda Hamilton原创
2024-11-19 09:54:03205浏览

Why Doesn't a Direct Type Alias Inherit Methods in Go?

理解 Go 中的类型别名

在 Go 中,类型别名可能会令人困惑。以下代码举例说明了这一点:

package main

import (
    "fmt"
    "time"
)

type dur struct {
    time.Duration
}

type durWithMethods dur

type durWithoutMethods time.Duration

func main() {
    var d durWithMethods // works !!
    fmt.Println(d.String())
    
    var dWM durWithoutMethods
    fmt.Println(dWM.String()) // doesn't compile
}

为什么直接别名 durWithoutMethods 不继承任何方法,与 durWithMethods 不同?

类型声明和别名

为了理解这一点,我们需要区分类型声明和类型别名。类型声明创建一个新类型,从其基础类型中剥离所有方法。另一方面,类型别名只是将新标识符绑定到现有类型。

方法解析

对于 durWithMethods,新类型 durWithMethods 是使用 dur 作为其基础类型创建。由于 dur 嵌入了 time.Duration,time.Duration 的方法被提升为 dur。因此,可以使用简写 d.Duration.String() 来调用 d.String()。

剥离方法

但是,在 durWithoutMethods 中,直接别名time.Duration,所有方法都被剥离。由于 Duration.String() 是 time.Duration 的方法,因此它不会被 durWithoutMethods 继承。

真实类型别名

真实类型别名,另一方面手,使用 = 符号表示:

type sameAsDuration = time.Duration

这会创建 time.Duration 的别名,而无需剥离方法。因此,sad.String() 的调用方式与 d.String() 类似。

以上是为什么直接类型别名不继承 Go 中的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn