/*
 * @description:struct相关知识
 * @Author: CP
 * @Date: 2020-08-21 09:34:47
 * @FilePath: \construction_management\learn\struct.go
 */
package learn

import (
	"fmt"
)

/*
没有class，只有struct结构体
没有构造函数，可以加工厂函数来构造
结构体过大也考虑使用指针接收者
结构体的方法的封装
首字母大写：public
首字母小写：private 只是针对包
包
每个目录一个包，为结构体定义的方法必须在同一个包内
结构体的方法可以分散在不同的文件内，同一个包内

扩展其他人写的包-学习go语言4-3
*/
type TreeNode struct {
	Value int
	// *类型是指针
	Left, Right *TreeNode
}

//为结构定义方法-方法名称前 定义好 (node treeNode)
//显示定义和命名方法接收者
func (node TreeNode) Print() {
	fmt.Println(node.Value)
}

//这里不使用指针是改不掉里面的值 node treeNode,需要指针
//只有使用指针才可以改变结构内容 nil指针也能调用方法
func (node *TreeNode) SetValue(value int) {
	node.Value = value
}

//遍历结构体treeNode
func (node *TreeNode) Traveres() {
	if node == nil {
		return
	}
	//如果在其他语言node.left是nil调用traveres()会挂掉，在go语言中不会
	node.Left.Traveres()
	node.Print()
	node.Left.Traveres()
	node.Print()
}

//工厂函数来构造treeNode
func CreateTreeNode(value int) *TreeNode {
	return &TreeNode{Value: value}
}

// func main() {
// 	// 创建结构的方式1
// 	var root2 treeNode
// 	fmt.Println(root2)
// 	// 创建结构的方式2
// 	root := treeNode{value: 3}
// 	//&取地址
// 	root.left = &treeNode{}
// 	// 创建结构的方式3
// 	root.left.right = new(treeNode)
// 	// 创建结构的方式4
// 	root.left.left = createTreeNode(2)
// 	// 创建结构的方式5
// 	node := []treeNode{
// 		{value: 3},
// 		{},
// 		{6, nil, nil},
// 	}
// 	fmt.Println(node)

// 	//调用结构体方法
// 	root.print()
// 	root.right.left.setValue(2)
// 	root.right.left.print()
// 	root.traveres()
// }
