gpt4 book ai didi

go - 递归打印树状结构的完整列表时遇到一些问题

转载 作者:行者123 更新时间:2023-12-02 17:11:33 24 4
gpt4 key购买 nike

我在为包含 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

我需要在代码中更改哪些内容才能获得上述所需的输出?是否有我可以遵循的算法或数据结构来解决这个问题?我尝试过深度优先和二分搜索,但我似乎无法将其塑造到我的结构中。

最佳答案

一个简单而优雅的解决方案是使用 print() 方法“武装”命令。这可以打印它的名称,以及它的子命令的范围,调用它们的 print() (执行相同的操作):

func (c *command) print() {
fmt.Println(c.name)
for _, sc := range c.subcommands {
sc.print()
}
}

然后在 main() 中打印命令只是调用它们的 print() 方法(甚至不需要/使用 getLastCommand() ) ):

for _, c := range commands {
c.print()
}

这将产生您想要的输出(在 Go Playground 上尝试):

base1
base2
base3
base3:sub1
base3:sub1:sub1
base3:sub2

请注意,当然 print() 不一定是一个方法,它也可能是一个常规函数,在这种情况下它可能如下所示:

func print(c *command) {
fmt.Println(c.name)
for _, sc := range c.subcommands {
print(sc)
}
}

以及main()中的循环:

for _, c := range commands {
print(&c)
}

结果是一样的,在 Go Playground 上试试这个.

我还建议保持一致。如果您决定使用指向 command 的指针,请在任何地方执行此操作(例如 main() 中的 commands slice 存储非指针,这就是为什么必须将其元素的地址传递给 print())。

关于go - 递归打印树状结构的完整列表时遇到一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59066267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com