我有两个对象。key1
是类型*rsa.PublicKey
。key2
类型*ssh.PublicKey
是隐藏*ssh.rsaPublicKey
对象的接口。ssh.rsaPublicKey
定义为:
type ssh.rsaPublicKey rsa.PublicKey
它还有一些额外的方法。但是,ssh.rsaPublicKey
由于该类“未导出”,所以我无法将任何一个键都转换key2
为一个,rsa.PublicKey
因为那没有实现ssh.PublicKey
,所以我也无法转换为一个,并且我无法访问the
N
或e
from,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中的变量一样)。 但是,如果要使用存储在其中的实际类型,则应该“强制转换”或“类型断