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

与私有接口比较

林浩漫
2023-03-14
问题内容

我有两个对象。key1是类型*rsa.PublicKeykey2类型*ssh.PublicKey是隐藏*ssh.rsaPublicKey对象的接口。ssh.rsaPublicKey定义为:

type ssh.rsaPublicKey rsa.PublicKey

它还有一些额外的方法。但是,ssh.rsaPublicKey由于该类“未导出”,所以我无法将任何一个键都转换key2为一个,rsa.PublicKey因为那没有实现ssh.PublicKey,所以我也无法转换为一个,并且我无法访问the
Nefrom,key2因为我不应该知道我有一个rsaPublicKey对象。

我应该怎么比较,key1并且key2是相同的密钥?


问题答案:

如前所述,您不能使用类型断言,因为您不能引用未导出的type
ssh.rsaPublicKey

使用reflect软件包可以实现您想要的一切。

由于rsa.PublicKey是的基础类型ssh.rsaPublicKey,因此可以将封装的 指针
key2转换为rsa.PublicKey。一旦你获得reflect.Value你的key2,“导航”到

利用价值Value.Elem()。该值可转换为type的值rsa.PublicKey。您可以使用Value.Convert()动态”将,在运行时将其转换为rsa.PublicKey。拥有后,您可以reflect.DeepEquals()用来进行比较,也可以手动进行比较。

它看起来像这样:

key1 := &rsa.PublicKey{N: big.NewInt(123), E: 10}
key2, _ := ssh.NewPublicKey(&rsa.PublicKey{N: big.NewInt(123), E: 10})


key2conv := reflect.ValueOf(key2).Elem().
    Convert(reflect.TypeOf(rsa.PublicKey{})).Interface()
// key2conf is an interface{}, wrapping an rsa.PublicKey

// Comparision with DeepEqual
fmt.Println(reflect.DeepEqual(*key1, key2conv))

// Comparing manually:
key22 := key2conv.(rsa.PublicKey)
fmt.Println(key1.N.Cmp(key22.N)) // Int.Cmp() returns 0 if equal
fmt.Println(key1.E == key22.E)

请注意,在手动比较时,比较PublicKey.N类型的字段*big.Int需要使用该Int.Cmp()方法,因为比较指针是比较内存地址,而不是指针值。如果两个值相等,则Int.Cmp()返回0



 类似资料:
  • 假设您有ClassA、ClassB、ClassC和InterfaceA。 ClassA和ClassB实现interfaceA,而classC包含一个列表

  • 在java 8之前,接口可以有以下类型的变量/方法。 常量变量 抽象方法 所以我们不能在接口中编写方法的实现,或者更确切地说,在Java 8之前实现默认实现。请参阅下面示例。 执行上面示例代码,得到以下结果 - 在上面的例子中,每个日志方法都有自己的实现。 使用Java 8接口可以有以下类型的变量/方法。 常量变量 抽象方法 默认方法 静态方法 让我们使用Java 8在接口中使用默认实现和静态方法

  • 大话接口隐私与安全 作为后端程序猿自己写的接口就像自己的孩子一样,尽然制造出来了,那就要对他以后的人生负责到底; 随着业务的壮大,需要支撑业务接口也越来越多,使用的用户量变大,虎视眈眈的黑客们视机而动,总是在业务中寻找着可以窃取他人利益的入口,所以我们应该多考虑安全性问题,防范于未然。  场景 服务端程序猿根据需求开发出业务相关的接口,用来满足需求中用户和服务器交互的功能,提供给前端或者客户端(P

  • 当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。

  • 我是java新手,试图理解一些概念。这是一段我不懂的代码。 我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是: 从java文档中,比较器[T]是一个接口。比较器[水果]怎么样?我将假设它是一个类,因为它必须覆盖比较函数。 为什么可以在{}中使用非参数构造函数和类定义来初始化FruitName比较器?我在比较器[T]的javadoc中没有找到这样的构造函数声明。 如有任何意见,将不胜感

  • 问题内容: 也许我并不完全了解泛型的功能,但是空接口与泛型有什么不同,特别是如果我们能够使用反射或类型开关的话?人们总是提到Go没有泛型,但是看起来它的工作可以与Java中的类似。 问题答案: 如果您来自Java,则空接口()实际上比使用泛型更接近使用Java中的变量。 您可以为分配任何内容(就像您可以使用Java中的变量一样)。 但是,如果要使用存储在其中的实际类型,则应该“强制转换”或“类型断