登录
首页 >  Golang >  Go问答

对类型别名的行为感到困惑

来源:stackoverflow

时间:2024-04-16 19:48:33 399浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《对类型别名的行为感到困惑》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

考虑以下代码(也在演示中):

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
}

我不明白为什么time.duration的直接别名不继承任何方法。是因为 time.duration 是原始类型的别名吗?


解决方案


Type declarations 有两种形式:别名声明和类型定义。

类型定义创建一个新类型并删除所有方法。类型别名“just”创建(绑定)一个新的标识符到相同的类型。使用“原始”名称或新名称是相同的。

你的第一个例子:

type durwithmethods dur

这将创建一个新类型 durwithmethods ,它将以 dur 作为其基础类型。由于底层类型是嵌入 time.duration 的结构,因此嵌入类型的方法会得到提升,并将成为嵌入器类型 method set 的一部分,因此 durdurwithmethods 。无论创建新类型,duration.string() 都会被提升,因为这个 string() 方法不是 dur 的方法,而是 time.duration 的方法。

当您编写 d.string() 时,它将是 d.duration.string() 的简写。

第二个例子:

type durwithoutmethods time.duration

创建一个新类型 durwithoutmethods ,它再次删除所有方法。由于 duration.string()time.duration 的方法,因此它不会是 durwithoutmethods 的方法。

真实类型别名如下所示:

type sameasduration = time.duration

由于它表示相同的类型,因此它还具有 string() 方法:

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

到这里,我们也就讲完了《对类型别名的行为感到困惑》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>