正在转换*加密货币.*rsa的PrivateKey.PrivateKey



我正在开发一个方法,该方法将根据作为参数传递的私钥类型进行签名。为了做到这一点,我正在传递一个*加密货币。PrivateKey变量作为参数。但是,当我想进行类型断言以使用参数时,问题就来了。

func Sign(text string, privKey *crypto.PrivateKey) string{
if _, ok := (*privKey).(rsa.PrivateKey) //This is ok
if _, ok := (privKey).(*rsa.PrivateKey) //This is not ok 2

我想我可以做第一件事,因为如果我使用"*&";,编译器认为它是一个接口。但我不知道为什么我不能做第二件事,当它应该是正确的。

顺便说一下,我需要使用一个*rsa类型的变量。PrivateKey,我可以这样做:

privRsa, _ := (*privKey).(rsa.PrivateKey)
var priv *rsa.PrivateKey
priv = &privRsa

我不明白的是为什么我不能直接转换*加密货币。PrivateKey转换为*rsa。PrivateKey,或者如果存在这样的方法。我认为现在这样做会在内存中分配新的空间,如果我想让它成为高效的,我就不应该这样做

crypto.PrivateKey是一个接口。*crypto.PrivateKey是指向接口的指针。您可以在接口上使用类型断言来获得底层值:

func Sign(text string, privKey crypto.PrivateKey) string{
if _, ok := privKey.(rsa.PrivateKey) 
...
}
...
var pkey rsa.PrivateKey
Sign(text,pkey)

这里,接口中的私钥值是rsa.PrivateKey的副本。

如果您传递pkey的地址,那么接口将有一个指向私钥的指针:

func Sign(text string, privKey crypto.PrivateKey) string{
if _, ok := privKey.(*rsa.PrivateKey) 
...
}
...
var pkey rsa.PrivateKey
Sign(text,&pkey)

最新更新