gpt4 book ai didi

go - 与私有(private)接口(interface)比较

转载 作者:IT王子 更新时间:2023-10-29 01:42:00 26 4
gpt4 key购买 nike

我有两个对象。 key1 的类型为 *rsa.PublicKeykey2*ssh.PublicKey 类型,它是一个隐藏了 *ssh.rsaPublicKey 对象的接口(interface)。 ssh.rsaPublicKey 定义为:

type ssh.rsaPublicKey rsa.PublicKey

它还有一些额外的方法。但是,我无法将任何一个 key 转换为 ssh.rsaPublicKey,因为该类“未导出”,我无法将 key2 转换为 rsa。 PublicKey 因为它没有实现 ssh.PublicKey,所以我无法从 访问 Ne key2 因为我不应该知道我有一个 rsaPublicKey 对象。

我应该如何比较 key1key2 是同一个 key ?

最佳答案

如您所述,您不能使用 type assertion因为您不能引用未导出的类型 ssh.rsaPublicKey

使用 reflect 可以实现您想要的效果包。

由于 rsa.PublicKeyssh.rsaPublicKey 的底层类型,pointed 值包裹在 key2 中可以转换为 rsa.PublicKey。一旦你获得reflect.Value您的 key2,使用 Value.Elem()“导航”到 pointed 值.此值可转换为 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()方法,因为比较指针比较的是内存地址,而不是指向的值。如果 2 个值相等,Int.Cmp() 返回 0

关于go - 与私有(private)接口(interface)比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com