首页 >后端开发 >Golang >Go 中的类型别名是否从其底层类型继承方法?

Go 中的类型别名是否从其底层类型继承方法?

DDD
DDD原创
2024-11-23 01:30:29699浏览

Do Type Aliases in Go Inherit Methods from Their Underlying Type?

类型别名和方法继承

考虑以下代码片段:

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
}

此代码演示了不同的方法创建类型别名及其对方法的影响继承。

类型别名与类型定义

Go 中,有两种类型的类型声明:别名和定义。

  • 类型别名: 为现有类型创建新名称,而不修改其结构或行为。
  • 类型定义: 使用自己的一组字段和方法创建新类型。

使用类型别名的方法继承

类型别名 durWithMethods 创建一个新类型,该类型从其基础类型继承方法, dur,它又嵌入 time.Duration。因此,durWithMethods 可以从 time.Duration 访问 String() 方法。

fmt.Println(d.String()) // works

相反,类型别名 durWithoutMethods 只是重命名 time.Duration。由于 time.Duration 是原始类型,因此它没有方法。因此,durWithoutMethods 没有 String() 方法。

fmt.Println(dWM.String()) // doesn't compile

具有相同基础类型的类型别名

真正的类型别名,它只是重命名现有类型,看起来像这样:

type sameAsDuration = time.Duration

在这种情况下,sameAsDuration 具有相同的方法作为 time.Duration 因为它代表相同的类型。

var sad sameAsDuration
fmt.Println(sad.String()) // works

因此,由于类型别名和类型定义之间的细微差别以及它们对方法继承的影响而产生了混乱。类型别名保留其基础类型的方法,而类型定义则使用自己的一组方法创建新类型。

以上是Go 中的类型别名是否从其底层类型继承方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

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