一、面向对象

  • go语言仅支持封装,不支持继承和多态
  • go语言没有 class,只有 struct

二、结构体的定义

package main

import "fmt"

type treeNode struct {
    value       int
    left, right *treeNode
}

func main() {
    var root treeNode
    root = treeNode{value: 3}
    root.left = &treeNode{}
    root.right = &treeNode{5, nil, nil}
    root.right.left = new(treeNode)

    // treeNode类型的slice
    nodes := []treeNode{
        {value: 3},
        {},
        {6, nil, &root},
    }

    fmt.Println(nodes)
}

treeNode 就是我们定义的一个结构体类型,结构体类型,其实就是我们自己定义的一个数据类型
不论地址还是结构本身,一律使用.来访问成员


三、为结构体定义方法

自定义一个print方法,他有一个接收者(node *treeNode),其实它与普通函数也是一样的,
把参数放在后面 print(node *treeNode)功能也是一样,只是参数位置不一样

注意:go 语言中,参数的传递都是“值传递”,这里我们指定了类型为“指针”
package main

import "fmt"

type treeNode struct {
    value       int
    left, right *treeNode
}

// 打印value
func (node *treeNode) print() {
    fmt.Println(node.value)
}

// 设置value
func (node *treeNode) setValue(value int) {
    if node == nil {
        fmt.Println("Setting value to nil node. Ignored.")
        return
    }
    node.value = value
}

// 中序遍历:按左、中、右遍历树结构
func (node *treeNode) traverse() {
    if node == nil {
        return
    }
    node.left.traverse()
    node.print()
    node.right.traverse()
}

func main() {
    var root treeNode
    root = treeNode{value: 3}
    root.left = &treeNode{}
    root.right = &treeNode{5, nil, nil}

    root.print()            // 3
    root.left.print()       // 0
    root.right.print()      // 5

    root.left.setValue(4);
    root.left.print()       // 4

    var pRoot *treeNode
    pRoot.setValue(3) // nil 也可以调用
}

注意setValue 方法,说明nil 也可以调用结构体方法,所以要根据实际情况,判断 node 是否为 nil


四、自定义工厂函数

go 语言没有“构造函数”,因为本身提供很多创建方式(参考上面的:结构体的定义),但是有些时候想自己控制构造,可以加一个工厂函数来实现

package main

import "fmt"

type treeNode struct {
    value       int
    left, right *treeNode
}

func (node *treeNode) print() {
    fmt.Println(node.value)
}

func createNode(value int) *treeNode {
    return &treeNode{value: value} // 如果是C++,这样返回一个局部变量地址是错误的,但是go支持这样做
}

func main() {
    var root treeNode
    root = treeNode{value: 3}
    root.left = createNode(5) // 使用工厂函数构造
}

createNode 函数就是我们自定义的工厂函数