与私有接口比较

2024-01-04

我有两个对象。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(使用前将#替换为@)

与私有接口比较 的相关文章

随机推荐

  • UITextView行高

    不确定之前是否提到过 但我无法在任何地方找到答案 I have UITextView随着一堆文本 大约 130 行 的变化 我需要在我的文本中获取该文本的 5 行高度UITextView 尝试这个 textView font lineHei
  • 尝试创建非自签名证书时出现异常

    我想从每个设备的自签名证书切换到一对证书 其中一个是之前生成的 放置在受信任的根证书颁发机构存储中 对于所有设备都是相同的 并且作为第二个证书的根 CA 该证书是根据每个设备生成的设备 并放置在个人存储中 我不想使用 makecert 因为
  • 如何使用 VBA 添加自定义功能区选项卡?

    我正在寻找一种在 Excel 功能区中添加自定义选项卡的方法 该选项卡将带有一些按钮 我偶然通过谷歌找到了一些解决这个问题的资源 但所有资源看起来都很狡猾而且极其复杂 有什么快速而简单的方法可以做到这一点 我希望当我的 VBA 加载到 Ex
  • 页面加载后,Xamarin WebView.CanGoBack 和 CanGoForward 始终返回 false

    我是 Xamarin Forms 的新手 如果我没有使用正确的词语 请原谅 我创建了一个名为 WebBrowser 的解决方案 以创建一个简单的移动浏览器 目前我正在处理通用文件主页 xaml and MainPage xaml cs 我正
  • MongoError:驱动程序与此服务器版本不兼容

    我刚刚安装了 Mongo Node 等 当我尝试通过 Nodejs 服务器更新数据库时 出现以下错误 MongoError driver is incompatible with this server version 这是我拥有的版本 N
  • 选择查询中 geo.distance 函数的返回值

    我正在使用 select 来查询索引 我想返回索引中 GeographyPoint 的距离 我正在尝试这样的事情 其中 GeoPoint 是位置字段 select ID geo distance GeoPoint geography POI
  • MySQL DELETE FROM 与 IN 条件的 UNION 子查询

    我遇到了一个奇怪的 SQL 错误 最后一个查询不起作用 当然 我可以将 DELETE 拆分为三个查询 但我真的想知道为什么 MySQL 不允许我这样做 一个小例子 SELECT id FROM stairs WHERE building 1
  • 如何测试某些程序集是否已加载到内存中? [复制]

    这个问题在这里已经有答案了 我有一些代码使用 Crystal Reports 运行时库来生成和丢弃一个小虚拟报告 以确保在用户创建真实报告之前将库及时加载到内存中 这是一个 感知性能 问题 当用户生成报告时 性能得到显着改善 因此显然一切正
  • 如何在日历日视图中添加圆形装饰器?

    我在用npanigrahy Custom Calendar View显示我的自定义日历 但我的问题是如何在日历中创建的事件上添加圆形项目符号 这是最好的使用方式this https github com prolificinteractiv
  • 无法为 iOS 编译 LAME

    我正在尝试将 lame mp3 编码器编译为 iOS 的静态库 我想支持所有架构 包括 i686 armv6 armv7 armv7s 和 arm64 这是我的构建脚本 bin bash DEVELOPER xcode select pri
  • 使用 Cocoa 遵循渐变路径

    我希望找到一种方法来遵循带有渐变的路径 以便渐变沿着路径的切线变化 Sorta like this 然而 到目前为止 我在搜索中找到的解决方案都使用了使用形状图层来掩盖渐变图层的变体 Which results in an unwanted
  • 没有 XmlRootElement 注释的 JAXB 解组?

    有没有什么方法可以在没有 XmlRootElement 注释的情况下对类进行解组 或者我们有义务输入注释吗 例如 public class Customer private String name private int age priva
  • 经典 ASP - 解析 JSON XMLHTTP 返回

    我无法找到一种好方法来解析从 XMLHTTP 获得的返回值 返回的是 JSON 用于获取 JSON 的 ASP 代码
  • 当我进行ajax调用时,尝试使用角度添加加载轮?

    我试图在进行 ajax 调用时实现加载轮指令 因此在响应时间内我想显示加载时间 使用下面的代码我没有看到任何错误 加载轮也没有 有没有更好的方法使用 angularJs 实现加载轮 or 下面的代码中实现了什么错误 主要 html
  • 缺少基础 SDK?

    我终于下载了新版本的 Xcode 和 iOS4 并最终尝试将我的第一个应用程序放到设备上 我正在查看配置文件并到达需要打开 Xcode 的地步 然后 设备 下拉菜单中只显示 Base SDK Missing 如果我进入 项目 gt 设置活动
  • TYPO3 TCA 类型在 FLUID 中选择?

    我在 T3 后端使用 TCA 类型选择 renderType selectMultipleSideBySide 这里是 TCA 代码 features gt array label gt Zusatz config gt array typ
  • 如何从 java.util.date 转换为 JodaTime 并获得相同的日期

    我关注这个问题 从 java util date 转换为 JodaTime https stackoverflow com questions 5042587 convert from java util date to jodatime
  • 为什么Java中的Float.MIN_VALUE是正值? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您认为 Float MIN VALU
  • CALayer:单个像素线看起来像 2 个像素

    这是我的代码 int columns 3 int columnWidth self layer bounds size width 3 for int c 1 c lt columns c CALayer layer CALayer lay
  • 与私有接口比较

    我有两个对象 key1属于类型 rsa PublicKey key2属于类型 ssh PublicKey这是一个隐藏了一个接口 ssh rsaPublicKey目的 ssh rsaPublicKey定义为 type ssh rsaPubli