我有一个保存标题类型定义的结构。我创建了一个应该在映射中返回值的方法,但它得到的为零。我怀疑这是因为它处理指针的方式,但我不确定它在哪里或如何出错。发生了什么事情?以下是我为查看正在发生的事情而投入的一些额外内容的片段: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 关注
- 105 浏览
添加回答
举报
0/150
提交
取消