当前位置: 首页 > 面试题库 >

此类型声明的含义是什么?

徐鸿文
2023-03-14
问题内容

我实际上是从(.NET)学习golang的,对此语言我一无所知。有时我会发现这种声明:

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

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

到底是什么意思?它是从[] byte继承的结构吗?

只是别名吗?

我以为golang禁止继承


问题答案:

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

类型定义使用与给定类型相同的基础类型和操作创建一个新的独特类型,并将标识符绑定到该类型。

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

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

例如,该类型[]int永远不会实现sort.Interface所需的(可通过sort包进行排序),因此将sort.IntSlice创建一个新类型(即type IntSlice []int),该类型附加了所需的方法,因此您可以将type的值传递sort.IntSlicesort.Sort()函数,但是不是type的值[]int。由于sort.IntSlice具有[]int作为其基础类型,因此,如果您具有的值[]int,则可以简单地将其转换为sort.IntSlice想要对其进行排序的形式,例如在此示例中(在Go
Playground
上尝试):

is := []int{1,3,2}
sort.Sort(sort.IntSlice(is))
fmt.Println(is) // Prints: [1 2 3]

创建新类型时,不涉及“继承”。新类型将具有0个方法。如果您想要“类似继承”的功能,则应签出嵌入(与struct类型有关),在这种情况下,嵌入器类型也将“具有”嵌入类型的方法。



 类似资料:
  • 我正在学习JavaScript及其库jQuery。我不知道为什么允许这种类型的声明(snake.x)而没有“let”或任何东西。这是我的代码

  • 我没有正确使用注释吗? 编译错误: 注释工作正常,可以毫无问题地访问该网页。

  • 我正在学习Spring和Data JPA。我对Ehcache有问题。我想缓存我的一个方法的返回值,该方法从数据库返回一些记录。这是一个预配置Ehcache实例的练习(我假设)。问题是,我不能使用注释@cacheable将我的方法标记为它的返回值应该被缓存的方法。我得到一个不兼容类型编译错误(Required:boolean,Found:String)。下面是我的服务层中的一个类,我认为我应该将@c

  • 2.11 和爪哇7。我正在尝试使用@XmlSchema注释我的包如下所示。 然而,我得到了这个编译错误,“注释类型不适用于这种声明” 有人知道为什么会发生这种事吗?

  • 问题内容: 我了解在创建这样的新对象时: 更通用,并且允许更多的可重用性,但是当创建tri时会发生以下情况: 由于Triangle是GeomObject的子类,因此tri还是不是GeomObject?声明的类型如何影响编译?谢谢 add:另一个问题:说我有 Integer n1 = new Integer(3); Object n2 = new Integer(4); System.out.pri

  • 我正在标准中寻找对这一事实的正式解释。我找到了3.9.1/9所说的,并试图用该部分给出解释。 第3.9.1/9节,N3797: void类型有一组空值。void类型是不完整的类型,无法完成。它用作不返回值的函数的返回类型。任何表达式都可以显式转换为cv void类型(5.4)。void类型的表达式只能用作表达式语句(6.2)、逗号表达式的操作数(5.18)以及?的第二个或第三个操作数:(5.16)