继承语法。有什么不同?
在 Go 中,下面有什么区别?
我试图搜索,但我想不出一个合适的术语来描述它们。它们的正式名称是什么?
#1 - 结构内的父级:
type MyTime struct {
time.Time
}
#2 - 在我的类型之后没有结构定义的父级:
type MyTime time.Time
对于#2,我可以用另一个 time.Time 来初始化我的类型mt := MyTime(t)。如何使用另一个 time.Time 变量初始化 #1 类型?
回答
Go 不是面向对象的语言,没有类型层次结构和继承。有关详细信息,请参阅Go 中创建复杂结构层次结构的惯用方法是什么?并转到嵌入式结构调用子方法而不是父方法。
您的第一个示例创建了一个新类型MyTime embedding time.Time。通过嵌入一个类型,嵌入类型的所有字段和方法都得到提升,并且就像它们是嵌入类型的字段或方法一样可用,例如当你想要实现一个接口时非常方便(因为提升的方法将“存在”无需声明它们)。
您可以像这样实例化它(有关详细信息,请参阅Golang 嵌入式结构类型):
t := MyTime{Time: time.Now()}
您的第二个示例创建了一个新类型,所有方法都将从中删除。当您不希望现有方法成为新类型的一部分时,这会很方便。一个闪亮的例子是String()当你想在你的实现中调用原始行为时定义方法或覆盖封送处理行为,有关详细信息,请参阅在 UnmarshalJSON 函数中调用 json.Unmarshal 而不会导致堆栈溢出。您可以使用简单的类型转换来创建它的值:
t := MyTime(time.Now())