我有两个对象。key1
属于类型*rsa.PublicKey
. key2
属于类型*ssh.PublicKey
这是一个隐藏了一个接口*ssh.rsaPublicKey
目的。ssh.rsaPublicKey
定义为:
type ssh.rsaPublicKey rsa.PublicKey
它还有一些额外的方法。但是,我无法将任一键投射到ssh.rsaPublicKey
由于该类“未导出”,所以我无法投射key2
to an rsa.PublicKey
因为这没有实现ssh.PublicKey
,并且我无法访问N
or e
from key2
因为我不应该知道我有一个rsaPublicKey
object.
我该如何比较key1
and key2
是相同的密钥吗?
正如你提到的,你不能使用类型断言 https://golang.org/ref/spec#Type_assertions因为你无法引用未导出的类型ssh.rsaPublicKey
.
你想要的可以通过使用reflect https://golang.org/pkg/reflect/包裹。
Since rsa.PublicKey
是底层类型ssh.rsaPublicKey
, the pointed价值包裹在key2
可以转换为rsa.PublicKey
。一旦你获得reflect.Value https://golang.org/pkg/reflect/#Value你的key2
,“导航”到pointed价值利用Value.Elem() https://golang.org/pkg/reflect/#Value.Elem。该值可转换为类型的值rsa.PublicKey
。您可以使用Value.Convert() https://golang.org/pkg/reflect/#Value.Convert“动态”,在运行时将其转换为rsa.PublicKey
。一旦你拥有它,你就可以使用reflect.DeepEquals() https://golang.org/pkg/reflect/#DeepEqual进行比较,或者手动比较。
它可能是这样的:
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() https://golang.org/pkg/math/big/#Int.Cmp方法,因为比较指针是比较内存地址,而不是指向的值。和Int.Cmp()
回报0
如果两个值相等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)