Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang中的类型声明和类型定义有什么区别?_Go - Fatal编程技术网

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

Golang中的类型声明和类型定义有什么区别?,go,Go,类型声明: type A = string 类型定义: type A string 他们之间有什么区别?我无法从规范中理解A=string类型为string创建别名。无论何时在代码中使用A,它都像字符串一样工作。例如,你不能在上面定义方法 类型字符串定义了一个新类型,该类型具有与字符串相同的表示形式。您可以在A和字符串之间以零成本进行转换,因为它们是相同的,但是您可以在新类型上定义方法,反射将了解类型A 例如在 输出: a is string b is main.B 表单type A=st

类型声明:

type A = string
类型定义:

type A string
他们之间有什么区别?我无法从规范中理解A=string类型为string创建别名。无论何时在代码中使用A,它都像字符串一样工作。例如,你不能在上面定义方法

类型字符串定义了一个新类型,该类型具有与字符串相同的表示形式。您可以在A和字符串之间以零成本进行转换,因为它们是相同的,但是您可以在新类型上定义方法,反射将了解类型A

例如在

输出:

a is string
b is main.B
表单type A=string在两者之间创建了一个别名,在该阶段无法扩展它们。这能解决什么问题?好吧,对于golang来说,它们可以帮助某些事情,比如代码库重构和修复,这里有一篇关于它的文章:


类型定义允许您使用一些附加行为扩展类型(如果需要),这通常是开发人员在希望从基本数据类型构建自定义数据类型时最有用的方法。

要明确术语,这两种方法都是

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

虽然,在您的特定示例type A=string中,您不能在其上定义方法,因为string是非本地类型,所以需要添加为非本地类型创建方法的功能,但它被拒绝了

第二个案例类型是字符串类型定义。基本上,它创建的新类型包含所有原始类型的字段,但不包含其方法:


意思是当我使用类型A=string时,A的行为将完全类似于string,并且可以在没有任何类型转换的情况下使用string类型,比如:-var p A=sfsdf;p+sdfds有效吗?在类型A字符串中,创建了一个新类型,这两种形式都是类型声明,第一种形式使用别名声明,第二种形式使用类型定义。类型别名在编程过程中没有任何用途,实际上它们什么都不做。它们在大规模代码重构过程中变得非常有用。你会在网上看到在他们介绍之前发生的激烈辩论。你根本不需要它们,也不应该使用它们!直到您需要它们。别名仅用于编译时@paul hankinI认为运行时反射数据中没有别名的任何表示形式,因此可以将其视为编译时别名。这回答了你的问题吗?@PaulHankin实际上,你可以在类型alias上定义方法,但在这种特殊情况下你不能这样做。请看我的answer@PaulHankin啊,对不起,误读了。像绳子一样。因此,例如,您不能在其上定义方法-为了清晰起见,我建议您重新表述。@GrigoriyMikhalkin或者您可以说您不能在类型别名上定义方法,但有时您可以使用别名在原始类型上定义方法。我认为我所写的内容是准确的,对问题的上下文是有帮助的,但我同意它并没有涵盖所有的边缘情况。
a is string
b is main.B
type A = string
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 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
}