// Package tree ... // // Description : tree ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2023-03-28 18:12 package tree import ( "strings" "git.zhangdeman.cn/zhangdeman/util" ) // Node 节点的数据结构 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:12 2023/3/28 type Node struct { IsVirtual bool // 是否虚拟节点, 主要应对输入的原始数据为list这一场景 Value interface{} // 节点的值 ValueType string // 数据类型 string / int64 / float64 / map / list / nil Key string // 节点的key名称(输入的原始名称) Show bool // 节点是否可见 ShowKey string // 重新序列化后, 对外输出的Key AllowEdit bool // 当前key是否允许编辑 AllowChangeType bool // 在允许编辑的情况下, 是否允许修改数据类型 DefaultValue interface{} // 输入为value为nil时候的默认值 ParentNode *Node // 父节点 PreBrotherNode *Node // 前一个兄弟节点 LastBrotherNode *Node // 下一个兄弟节点 SonNodeList []*Node // 子节点列表 ObjectStack []string // 对象信息堆栈, 利用栈的括号匹配, 判断某一个对象是否扫面完成 } // NewNode 创建新节点 // // Author : go_developer@163.com<白茶清欢> // // Date : 23:02 2023/3/28 func NewNode(key string, value string, valueType string, parentNode *Node) *Node { n := &Node{ IsVirtual: false, Value: value, ValueType: valueType, Key: key, Show: false, ShowKey: "", AllowEdit: false, AllowChangeType: false, DefaultValue: nil, ParentNode: parentNode, PreBrotherNode: nil, LastBrotherNode: nil, SonNodeList: nil, ObjectStack: make([]string, 0), } switch valueType { case ValueTypeString: n.Value = value case ValueTypeInteger: var v int64 _ = util.ConvertAssign(&v, value) n.Value = v case ValueTypeFloat: var v float64 _ = util.ConvertAssign(&v, value) n.Value = v case ValueTypeBool: n.Value = strings.ToLower(value) == "true" case ValueTypeMap: n.Value = map[string]interface{}{} n.SonNodeList = make([]*Node, 0) case ValueTypeArray: n.Value = []interface{}{} n.SonNodeList = make([]*Node, 0) } // 处理 preBrother 和 lastBrother if parentNode.ValueType == ValueTypeMap || parentNode.ValueType == ValueTypeArray { // map 和 array 才有所谓的兄弟节点 if len(parentNode.SonNodeList) > 0 { // 设置新节点的 pre 节点 n.PreBrotherNode = parentNode.SonNodeList[len(parentNode.SonNodeList)-1] // 设置当前最后一个节点的 last 节点 parentNode.SonNodeList[len(parentNode.SonNodeList)-1].LastBrotherNode = n } // 新节点追加到子节点末尾 parentNode.SonNodeList = append(parentNode.SonNodeList, n) } return n } // NewVirtualNode 创建一个新的虚拟节点 // // Author : go_developer@163.com<白茶清欢> // // Date : 23:08 2023/3/28 func NewVirtualNode() *Node { return &Node{ IsVirtual: true, SonNodeList: make([]*Node, 0), ObjectStack: make([]string, 0), } }