【发布时间】:2020-03-22 18:39:30
【问题描述】:
我在为具有 n 个命令的 CLI 工具创建结构时遇到问题。每个命令可以有 n 个子命令,每个子命令可以有 n 个子命令。
我的问题是,在 Go 中,我正在努力寻找一种方法来创建递归函数来输出每个命令的名称,以及每个 n 子命令 + 每个 该子命令的 n 个子命令,在一个完整列表中。
例如,我希望得到以下输出:
1. command1
2. command2
3. command3
4. command3 subcommand1
5. command3 subcommand1 subcommand1
6. command3 subcommand2
这是我的代码:
package main
import (
"fmt"
)
type command struct {
name string
parent *command
subcommands []*command
}
func getLastCommand(c command) command {
for _, s := range c.subcommands {
if len(s.subcommands) == 0 {
return *s
}
return getLastCommand(*s)
}
return c
}
func main() {
cmdBase1 := command{
name: "base1",
}
cmdBase2 := command{
name: "base2",
}
var (
cmdBase3,
cmdBase3Sub1,
cmdBase3Sub1Sub1,
cmdBase3Sub2 command
)
cmdBase3 = command{
name: "base3",
subcommands: []*command{&cmdBase3Sub1, &cmdBase3Sub2},
}
cmdBase3Sub1 = command{
name: "base3:sub1",
parent: &cmdBase3,
subcommands: []*command{&cmdBase3Sub1Sub1},
}
cmdBase3Sub1Sub1 = command{
name: "base3:sub1:sub1",
parent: &cmdBase3Sub1,
}
cmdBase3Sub2 = command{
name: "base3:sub2",
parent: &cmdBase3,
}
// root commands
commands := []command{
cmdBase1,
cmdBase2,
cmdBase3,
}
for _, c := range commands {
last := getLastCommand(c)
fmt.Println(last.name)
}
}
https://play.golang.org/p/HZPRlSghfAY
这是当前的输出:
base1
base2
base3:sub1:sub1
我想要的输出是上面的代码是:
base1
base2
base3
base3:sub1
base3:sub1:sub1
base3:sub2
我需要在我的代码中进行哪些更改才能获得上述所需的输出?有没有我可以遵循的算法或数据结构来解决这个问题?我尝试过深度优先和二分搜索,但似乎无法将其融入我的结构。
【问题讨论】: