tree - Golang 中的这段代码是惯用的吗?持久化树

标签 tree go persistent idioms

我正在学习 GO,我正在尝试实现一些不太琐碎的东西,一棵持久的平衡树,我想知道我写的代码是否符合惯用语。

这是不完整的代码:

package main

import (
       "fmt"
       "errors"
)

type Node struct{
     value int
     left * Node
     right * Node
}

func TraverseTree(root Node) {
     if root.value != 0 {
        TraverseTree(*root.left)
        fmt.Println(root.value)
    TraverseTree(*root.right)}
     return
}

func MakeNode(value int) (Node) {
     node := Node{value: value,
                 right: &Node{},
         left:  &Node{}}
     return node
}

func AddNode(root Node, value int) (newNode Node, error error){
     alreadyPresentError := errors.New("Element already present")
     if root.value == 0 {
        fmt.Println("Creating new Node of value: ", value)
        newNode = MakeNode(value)
    error = nil
     } else if root.value == value {
        newNode = root
        error = alreadyPresentError
     }else if value > root.value{ //going right
        fmt.Println("Going Right")
        nodeLeft, err := AddNode(*root.right, value)
    if err != nil {
        newNode = root
        err = alreadyPresentError
    }else{
            newNode = Node{value: root.value, 
                       left:  root.left, 
                   right: &nodeLeft}
        error = nil}
     }else if value < root.value{ //going left
        fmt.Println("Going left")
        nodeRight, err := AddNode(*root.left, value)
    if err != nil {
        newNode = root
        err = alreadyPresentError
    }else{
            newNode = Node{value: root.value, 
                   left:  &nodeRight, 
               right: root.right}
        error = nil}}
     return
}

真正让我信服的是我如何处理错误,但可能还有其他一些错误。

最佳答案

有几件事需要处理:

  • 始终使用 go fmt 格式化您的代码
  • 使用 switch 而不是 if-else 链

其余的更多是品味问题。您可能可以通过不使用命名的返回值来使代码更清晰,但这是我的意见。以下是我的建议:

// Moved it up here to reuse a single instance of the error
var alreadyPresentError = errors.New("Element already present")

func AddNode(root Node, value int) (Node, error) {
    switch {
    case root.value == 0:
        fmt.Println("Creating new Node of value: ", value)
        return MakeNode(value), nil
    case root.value == value:
        return root, alreadyPresentError
    case value > root.value:
        //going right
        fmt.Println("Going Right")
        nodeLeft, err := AddNode(*root.right, value)
        if err != nil {
            return root, alreadyPresentError
        }
        return Node{value: root.value,
            left:  root.left,
            right: &nodeLeft}, nil    
    case value < root.value: //going left
        fmt.Println("Going left")
        nodeRight, err := AddNode(*root.left, value)
        if err != nil {
            return root, alreadyPresentError
        }
        return Node{value: root.value,
            left:  &nodeRight,
            right: root.right}, nil    
    }
    // Dummy return. If you don't like dummies, delete the case root.value == value case
    return root, alreadyPresentError
}

关于tree - Golang 中的这段代码是惯用的吗?持久化树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20013060/

相关文章:

go - Redigo ScanStruct 错误与 time.Time

rest - 如何在 golang 中使用 julienschmidt/httprouter 传递两个或多个参数?

c++ - 三元搜索树

java - 继承和递归数据结构(树): identical child class with one method removed behaves differently

go - 控制台中的多行输入

ruby - 在 Ruby 中持久化哈希

java - 在多对多 hibernate 中覆盖关系表数据

c# - 在树结构中通过 ID 属性定位实例

java - 为什么 isBinarySearchTree() 函数不正确

Android XML 首选项问题。不能让它持久