向接收接口指针的函数传递结构体指针的问题求助
错误核心是你误用了接口的指针类型(*shared_types.OhlcResponseHolder)作为映射元素类型。Go的接口设计中,接口本身就能容纳实现它的指针类型实例,*KrakenOHLCResponseHolder是OhlcResponseHolder接口的实现者,但它和*OhlcResponseHolder(接口的指针)是完全不同的类型,自然无法匹配。
1. 修正映射的元素类型
把ohlcMap里的元素类型从*shared_types.OhlcResponseHolder改为shared_types.OhlcResponseHolder:
type ohlcMap struct { holders map[string]shared_types.OhlcResponseHolder }
2. 调整Set方法的参数类型
让Set方法接收接口类型本身,而非接口指针:
func (om *ohlcMap) Set(key string, holder shared_types.OhlcResponseHolder) { om.holders[key] = holder }
3. 正常传递指针实例调用Set
由于*KrakenOHLCResponseHolder已经实现了OhlcResponseHolder接口,直接传&tmp即可:
var tmp KrakenOHLCResponseHolder // 初始化tmp的字段... ohlcMapInstance.Set("kraken", &tmp)
Go的接口内部会存储两个值:实际的实例(或指针)和对应类型信息。当你把指针类型(比如*KrakenOHLCResponseHolder)赋值给接口变量时,接口会自动持有这个指针,完全不需要再对接口本身取指针。
如果强行使用*OhlcResponseHolder,相当于要存储“接口的指针”,这在Go里几乎没有实用场景,还会造成类型不匹配——毕竟*KrakenOHLCResponseHolder是实现接口的类型,不是接口指针的类型。
如果你的OhlcResponseHolder接口方法需要修改结构体内部状态,必须用指针类型实现接口(你当前的*KrakenOHLCResponseHolder已经满足),这种设计完全符合Go的规范,接口会正确传递指针的修改能力。
内容的提问来源于stack exchange,提问作者Grant

