You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向接收接口指针的函数传递结构体指针的问题求助

问题分析

错误核心是你误用了接口的指针类型(*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:21:58