这种类型声明的含义是什么?

时间:2018-03-21 09:09:55

标签: go type-declaration

我实际上是在学习golang(来自.NET),有一点我对这种语言不了解。 有时我会发现这种声明:

https://github.com/golang/crypto/blob/master/ed25519/ed25519.go

// PublicKey is the type of Ed25519 public keys.
type PublicKey []byte

这究竟是什么意思? 它是一个从[] byte继承的结构吗?

它只是一个别名吗?

我认为golang禁止继承。

1 个答案:

答案 0 :(得分:10)

这是type declaration,更具体地说是类型定义。它创建了一个新类型,其基础类型为[]byte

  

类型定义创建一个新的,不同的类型,其具有与给定类型相同的underlying type和操作,并将标识符绑定到它。

创建新类型是因为它们可以简化多次使用它们,它们的标识符(它们的名称)可能在其他上下文中表达,并且 - 最重要的是 - 以便您可以定义(附加)方法(您不能将方法附加到内置类型,也不附加到其他包中定义的匿名类型或类型。)

最后一部分(附加方法)很重要,因为即使不是附加方法,您也可以轻松地创建和使用接受“原始”类型作为参数的函数,只有带有方法的类型才能实现列出的接口(“规定“)那些方法,并且如前所述,除非你创建一个从它们派生的新类型,否则你不能将方法附加到某些类型。

例如,类型[]int永远不会实现sort.Interface所需的可排序(sort包),因此会创建一个新类型sort.IntSlice(附加了所需方法的type IntSlice []int),因此您可以将sort.IntSlice类型的值传递给sort.Sort()函数,但不能传递类型[]int的值。由于sort.IntSlice的基础类型为[]int,因此,如果您的值为[]int,则只需将convert sort.IntSlice添加到is := []int{1,3,2} sort.Sort(sort.IntSlice(is)) fmt.Println(is) // Prints: [1 2 3] ,如果您想对其进行排序,就像在这个例子中一样(在Go Playground上试试):

{ "_id" : "5ab0f445edf197158835be63", "userid" : "5aaf15c28264ee17fe869ad8", "lastmodified" : ISODate("2018-03-21T07:04:41.735Z") }
{ "_id" : "5ab0f445edf197158835be64", "userid" : "5aaf15c28264ee17fe869ad8", "lastmodified" : ISODate("2018-02-20T12:31:08.896Z") }
{ "_id" : "5ab0f445edf197158835be65", "userid" : "5aaf15c28264ee17fe869ad7", "lastmodified" : ISODate("2018-02-20T02:31:08.896Z") }

创建新类型时,不涉及“继承”。新类型将有0个方法。如果你想要“类继承”功能,你应该检查嵌入(与struct types相关),在这种情况下,嵌入器类型也将“拥有”嵌入类型的方法。