2016-08-18 55 views
2

我有兩個對象。 key1類型爲*rsa.PublicKeykey2*ssh.PublicKey類型,它是隱藏*ssh.rsaPublicKey對象的接口。 ssh.rsaPublicKey定義爲:與私人界面比較

type ssh.rsaPublicKey rsa.PublicKey 

而且它有一些額外的方法。然而,我不能將任一鍵投到ssh.rsaPublicKey,因爲該類別是「未導出」,我無法將key2轉換爲rsa.PublicKey,因爲它沒有實現ssh.PublicKey,並且我無法從key2訪問Ne因爲我不應該知道我有一個rsaPublicKey對象。

我該怎麼比較key1key2是一樣的關鍵?

+0

對於國有企業你對平等的定義是什麼?我猜想有一些方法可以獲取數據或進行轉換。 – evanmcdonnal

+0

我對平等的定義是「相同的模數,相同的N」。 –

回答

2

正如您所提到的,您不能使用type assertion,因爲您無法參考未導出類型ssh.rsaPublicKey

想要使用reflect包時可能需要什麼。

由於rsa.PublicKey是基礎類型的ssh.rsaPublicKey,所述指出包裹在key2值可以被轉換爲rsa.PublicKey。一旦獲得key2reflect.Value,請使用Value.Elem()「導航」指向的值。該值可轉換爲類型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