gpt4 book ai didi

go - 将通用映射转换为 YAML。语言

转载 作者:行者123 更新时间:2023-12-01 22:22:36 25 4
gpt4 key购买 nike

因此,我正在开发一个程序,您必须在其中生成 YAML 文件,该文件表示来自给定目录位置(path)的目录树。例如..

sc
├── file.go
├── file_test.go
└── src
├── deploy
│   ├── deploy.go
│   └── deploy_test.go
├── pod.go
└── pod_test.go

这应该转换为

sc:
fileTest: "true"
src:
deploy:
deployTest: "true"
podTest: "true"

请注意,上面只有带有 _test 的文件。被选中(有条件的问题不大)。我的问题是如何生成通用 map[string]interface{}可以通过 YAML 表示的目录树中的映射类型。我试过写一个 DFS实现遍历树并生成 n-ary树。其中有以下输出。我得到了根 Node树的对象。

name: sc
children:
- name: file.go
children: []
- name: file_test.go
children: []
- name: src
children:
- name: deploy
children:
- name: deploy.go
children: []
- name: deploy_test.go
children: []
- name: pod.go
children: []
- name: pod_test.go
children: []

但正如你所见,它是 unmarshalled使用代表每个节点的数据类型。

//Node is the datatype which stores information regarding the file/directory
type Node struct {
Name string
Path string
Children []*Node
}

我想要一个通用的 YAML,其中每个键都不同。有任何想法吗?这样的事情会有所帮助。

func (node *Node) ToMap() map[string]interface{}{
//Logic
}

生成树的 DFS 代码

func IteratePath(path string) {
rootFile, err := os.Stat(path)
if err != nil {
logrus.Error("Path : ", path, " doesn't exist. ", err)
}
rootfile := ToFile(rootFile, path)
stack := []*tree.Node{rootfile}
for len(stack) > 0 {
file := stack[len(stack)-1]
stack = stack[:len(stack)-1]
children, _ := ioutil.ReadDir(file.Path)
for _, chld := range children {
child := ToFile(chld, filepath.Join(file.Path, chld.Name()))
file.Children = append(file.Children, child)
stack = append(stack, child)
}
}

func ToFile(file os.FileInfo, path string) *tree.Node {
outFile := tree.Node{
Name: file.Name(),
Children: []*tree.Node{},
Path: path,
}
return &outFile
}

最佳答案

您已经在使用递归(使用堆栈变量而不是调用堆栈),那么为什么不再次使用递归将您的树转换为嵌套映射。这是我写的一个从节点开始的方法(基于你的 Node 上面的结构):

树到嵌套映射方法:

type Node struct {
Name string
Children []*Node
}

func (n *Node) ToMap() interface{} {
if len(n.Children) < 1 {
return "true"
}

yamlMap := make(map[string]interface{})

for _, child := range n.Children {
yamlMap[child.Name] = child.ToMap()
}

return yamlMap
}

此函数生成的映射可由 gopkg.in/yaml.v2 编码。成你想要的格式的 YAML 文件。

这是在 Go Playground 中运行的代码包括编码到 YAML

关于go - 将通用映射转换为 YAML。语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62205896/

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