【问题标题】:Golang: struct embedding vs "aliasing"Golang:结构嵌入与“别名”
【发布时间】:2019-09-15 08:17:19
【问题描述】:

我知道结构嵌入

type newType struct {someStruct}

我知道类型别名:

type newType = someStruct

但是有什么实际的理由使用

type newType someStruct

原始类型呢?

type newType int

这种定义的正确名称是什么?

【问题讨论】:

  • 这是一个类型定义,据我所知没有其他名称。它允许您轻松定义与您在定义中引用的具有相同结构或内存布局的类型。

标签: go types


【解决方案1】:

命名:所有的sn-ps都是type declarations。其中一个声明是 type alias(带有 = 的那个)。其余的声明是 type definitions。这些定义中的第一个使用带有嵌入字段的结构。

type newType someStruct 代码在想要定义一种与其他结构类型具有相同内存布局的新类型时很有用。这可能是因为程序员想在相同的内存布局上使用不同的方法。

代码type newType int 可用于定义与int 语义不同的类型或将方法附加到原始类型。一个例子见reflect.Kind

【讨论】:

  • 最后一种情况的两个主要原因:1)定义两个内存等效类型(例如rune vs int32)之间的语义差异,或2)在两种内存等效类型上定义不同的方法集;虽然 1 没有 2 并不少见,但 2 没有 1 是。
【解决方案2】:

结构嵌入与“别名”


您正在与不同的结构混为一谈。

struct embedding的定义见The Go Programming Language Specification


这是 Go 类型别名的解释和基本原理。

Go 1.9 Release Notes(2017/08/24 发布)

Changes to the language

Go 现在支持类型别名以支持渐进式代码修复,同时 在包之间移动类型。 type alias design documentan article on refactoring 详细介绍了这个问题。在 简而言之,类型别名声明的形式为:

type T1 = T2

这个声明引入了一个别名T1——一个替代 拼写——对于T2表示的类型;也就是说,T1T2 表示同一类型。


【讨论】:

    猜你喜欢
    • 2021-06-20
    • 2017-12-24
    • 2014-08-11
    • 2022-11-22
    • 2013-10-17
    • 2015-05-16
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多