当所有可能的类型具有相同的方法时,将泛型(接口)强制转换为类型



取方法:

x509.CreateCertificate(rand.Reader, &template, &template, publicKey, privateKey)

查看定义,这里的publicKey和privateKey都是'any'类型。在编译时,我不知道用户将提供哪种类型的密钥-并且似乎很好,因为我可以传递任何一个。

然而,我正在努力处理any到这两种类型的密钥中的任何一种。

在我意识到我可能有问题之前,这是我到达的地方:

var privKey any
switch priv.(type) {
case *ecdsa.PrivateKey:
privKey = priv.(*ecdsa.PrivateKey)
case *rsa.PrivateKey:
privKey = priv.(*rsa.PrivateKey)
default:
return nil, nil, errors.New("no valid key type passed")
}
der, err := x509.CreateCertificate(rand.Reader, &template, &template, &privKey.PublicKey, priv)

我可以将CreateCertificate调用移动到案例中,但这似乎是复制错误。正确的做法是什么?

正如在评论中指出的那样,解决方案是私钥都遵守我错过的crypto.Signer接口。

因此可以做priv.(crypto.Signer).Public()

最新更新