Go语言中如何替代指向接口的指针?(流程图数据结构场景)
问题解决方法
首先纠正一个语法错误:Go的接口定义只能包含方法签名,不能定义字段。你原来的Block接口写法有误,应该修改为:
type Block interface { Next() Block // 首字母大写遵循Go导出规则,方法签名定义正确 }
针对你遇到的「无法对接口类型取地址」编译错误,结合你想要指针方案、依赖编译器安全、无需索引验证的需求,提供两种可行方案:
方案1:数组直接存储实现Block接口的指针类型
将blockArrStruct的数组定义为存储Block接口类型(因为*PassBlock这类指针实现了Block接口,可直接存入),直接返回数组第一个元素即可,无需取地址:
type PassBlock struct { next Block } // 指针接收器实现Block接口 func (block *PassBlock) Next() Block { return block.next } type blockArrStruct struct { arr []Block // 存储*PassBlock等实现Block的指针实例 } func (barr blockArrStruct) StartBlock() Block { return barr.arr[0] // 直接返回,arr[0]本身就是有效Block指针 }
这种方案完全符合你的需求:
- 编译器保证存入数组的都是实现了
Block的有效类型,无需额外验证 - 直接返回指针类型的接口值,避免了接口地址的问题
- 遵循Go接口的常规使用方式,代码简洁易维护
方案2:返回接口指针(不推荐)
如果一定要返回指针类型,可以调整StartBlock的返回值为*Block,但这种方式在Go中很少使用,因为接口指针本身不实现Block接口,调用方法时需要额外解引用,代码繁琐:
func (barr blockArrStruct) StartBlock() *Block { return &barr.arr[0] } // 调用示例 func main() { barr := blockArrStruct{arr: []Block{&PassBlock{}}} start := barr.StartBlock() (*start).Next() // 必须解引用才能调用方法 }
总结
方案1是最合理的选择,既满足你的指针安全需求,又符合Go的语言设计惯例,避免不必要的复杂度。
内容的提问来源于stack exchange,提问作者user2958456
相关产品推荐
相关产品推荐

