Go语言中,能否将继承自同一结构体的Knight、King存入同一数组?
Go中如何将不同棋子类型存入同一数组?
你写的[]character{Knight{}, King{}}这种写法行不通,原因很简单:Go语言没有传统的类继承机制,你这里的Knight和King只是嵌入了character结构体,它们和character是完全独立的类型,不能直接存入character类型的数组。
正确的解决方式:用接口实现多态
Go处理这类“不同类型但有共同行为”的场景,标准做法是用接口。具体步骤如下:
- 定义一个代表棋子行为的接口
type ChessPiece interface { Move() }
Go的接口是隐式实现的——只要某个类型拥有接口里定义的所有方法,就自动满足这个接口。你的Knight和King已经实现了Move方法,所以它们都属于ChessPiece类型。
- 创建接口类型的数组,存入棋子实例
func main() { // 现在可以把Knight和King存入同一个[]ChessPiece数组 pieces := []ChessPiece{Knight{}, King{}} // 遍历数组,调用每个棋子的Move方法 for _, piece := range pieces { piece.Move() } }
运行这段代码会输出:
Moving Kinght... Moving King...
如果需要访问棋子的位置字段
如果要获取或修改currPosition,可以给接口新增方法,然后在每个棋子类型里实现它:
type ChessPiece interface { Move() GetPosition() [2]int SetPosition(pos [2]int) } // Knight实现位置相关方法 func (k Knight) GetPosition() [2]int { return k.c.currPosition } func (k *Knight) SetPosition(pos [2]int) { k.c.currPosition = pos } // King同样实现位置相关方法 func (k King) GetPosition() [2]int { return k.c.currPosition } func (k *King) SetPosition(pos [2]int) { k.c.currPosition = pos }
注意SetPosition用指针接收者,这样才能修改结构体内部的字段值。
内容的提问来源于stack exchange,提问作者Shakya Peiris
相关产品推荐
相关产品推荐

