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

Go语言中,能否将继承自同一结构体的Knight、King存入同一数组?

Go中如何将不同棋子类型存入同一数组?

你写的[]character{Knight{}, King{}}这种写法行不通,原因很简单:Go语言没有传统的类继承机制,你这里的Knight和King只是嵌入了character结构体,它们和character是完全独立的类型,不能直接存入character类型的数组。

正确的解决方式:用接口实现多态

Go处理这类“不同类型但有共同行为”的场景,标准做法是用接口。具体步骤如下:

  1. 定义一个代表棋子行为的接口
type ChessPiece interface {
    Move()
}

Go的接口是隐式实现的——只要某个类型拥有接口里定义的所有方法,就自动满足这个接口。你的Knight和King已经实现了Move方法,所以它们都属于ChessPiece类型。

  1. 创建接口类型的数组,存入棋子实例
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42