Golang中的类型声明和类型定义有什么区别?

时间:2020-04-16 10:20:19

标签: go

类型声明:

type A = string

类型定义:

type A string

它们之间有什么区别?我无法从规范中了解

3 个答案:

答案 0 :(得分:3)

type A = stringstring创建别名。每当您在代码中使用A时,其工作方式就与string一样。因此,例如,您无法在其上定义方法。

type A string定义了一个新类型,其表示形式与string相同。您可以以零成本在Astring之间进行转换(因为它们是相同的),但是您可以在新类型上定义方法,并且反射将知道类型A

例如(在playground上)

package main

import (
    "fmt"
)

type A = string
type B string

func main() {
    var a A = "hello"
    var b B = "hello"
    fmt.Printf("a is %T\nb is %T\n", a, b)
}

输出:

a is string
b is main.B

答案 1 :(得分:3)

type A = string格式在两者之间创建了一个别名,它们不能在该阶段扩展。这解决了什么目的?好吧,对于golang来说,它们可以帮助某些事情,例如代码库重构和修复,这里有一篇很棒的文章:https://talks.golang.org/2016/refactor.article

类型定义允许您根据需要扩展类型,并具有一些其他行为,当您要从基本数据类型构建自定义数据类型时,这通常是作为开发人员最有用的类型。

答案 2 :(得分:3)

为明确起见,它们均为type declarations

type A = string

这称为别名声明。即您为类型创建别名。基本上,类型和别名之间没有区别。您可以在别名上定义方法,这些方法可用于初始类型实例。 Example

type A struct {}

type B = A

func (B) print() {
    fmt.Println("B")
}

func main() {
    a := A{}
    b := B{}

    a.print()  // OUTPUT: B
    b.print()  // OUTPUT: B
}

尽管在您的特定示例type A = string中,您无法在其上定义方法,因为string是非本地类型(有一个proposal可以添加为非本地类型创建方法的功能但被拒绝了。)

第二种情况type A string是类型定义。基本上,它正在创建具有原始类型的所有字段的新类型,但不是方法。 Example

type A struct {}

func (A) print() {
    fmt.Println("A")
}

type B A

func (B) print() {
    fmt.Println("B")
}

func main() {
    a := A{}
    b := B{}

    a.print()  // OUTPUT: A
    b.print()  // OUTPUT: B
}
相关问题