我有一個保存標題類型定義的結構。我創建了一個應該在映射中返回值的方法,但它得到的為零。我懷疑這是因為它處理指針的方式,但我不確定它在哪里或如何出錯。發生了什么事情?以下是我為查看正在發生的事情而投入的一些額外內容的片段:func (s *stctClientPubKeys) GetServerPrivateKey(keyClientPubkey *rsa.PublicKey) *rsa.PrivateKey {var keyPrivateKey *rsa.PrivateKeys.RLock()keyPrivateKey = s.mpClientPubKeys[keyClientPubkey]s.RUnlock()// TODO Remove thisfmt.Print("KEYINSTRUCT ")fmt.Println(keyPrivateKey)s.RLock()fmt.Print("WHOLEMAPINSTRUCT ")fmt.Println(s.mpClientPubKeys)for k, v := range s.mpClientPubKeys { chnLogging <- "GetServerPrivateKey(): Recv N = " + keyClientPubkey.N.String() chnLogging <- "GetServerPrivateKey(): Key N = " + k.N.String() chnLogging <- "GetServerPrivateKey(): Val N = " + v.PublicKey.N.String()}s.RUnlock()return keyPrivateKey}在示例運行中打印了哪些內容?KEYINSTRUCT <nil>WHOLEMAPINSTRUCT map[0xc00021e000:0xc0000644e0]GetServerPrivateKey(): Recv N = 284429934903843367309<cut>GetServerPrivateKey(): Key N = 284429934903843367309<cut>GetServerPrivateKey(): Val N = 238865868438483289364<cut>當我嘗試訪問返回的私鑰時,最終結果當然是:panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x53ce07]
1 回答

弒天下
TA貢獻1818條經驗 獲得超8個贊
正如 blackgreen 所暗示的那樣,這可能是因為您在地圖中存儲了一個指針,而地圖中的公鑰在語義上是等效的,但不是索引。==
你沒有說你如何獲取函數的參數,但假設這是在某種服務器上,其中私鑰是從線路或文件中解析的,你將獲得一個新分配的對象。這將出現在地圖中引用的內存中的其他位置,因此即使模量和指數相同,指針也會有所不同。該類型具有可用于比較的 Equal 方法,因為此方法不起作用。==
有兩種簡單的方法可以獲得我懷疑你想要的行為:
使用切片并循環訪問,調用
。Equal(keyClientPubkey)
在每個,而不是一個映射。只要您擁有的公鑰少于數百個,這可能就可以了。(基準測試可以告訴您環境中的確切斷點)創建一個幫助器函數,該函數采用 a 并返回可用作鍵的可比較內容(例如字符串)。一個簡單的版本是類似于 .使用它,您可以基于字符串表示形式存儲和檢索公鑰。
toMapKey
*rsa.PublicKey
return fmt.Sprintf("n=%x|e=%x", pk.N, pk.E)
注意:如果這是安全敏感代碼路徑(例如,如果對手可以隨意觸發它),我不建議使用上述任何一種方法,因為您可能會泄露計時信息。如果是這種情況,請向安全專家尋求幫助,:)。如果你只是在啟動期間這樣做,那可能沒問題。
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報
0/150
提交
取消