面向对象
_go 语言仅支持封装,不支持继承和多态
go 语言没有class ,只在 struct(结构)_
type treeMenuNode struct{
name string
perent,child * treeMenuNode
}
// 使用自定义工厂函数
// 返回局部变量地址( go 在返回地址后,会在堆上分配)
func createTreeNode (name string) *treeMenuNode{
return &treeMenuNode{name:name}
}
/*
为结构体定义方法
改变内部必须使用指针接收者
结构过太大时应该考虑采用指针接收者实现
结构复杂,过于庞大时应用统一采用指针接收者实现,方便维护,一致性
*/
// 值接收者**
func (node treeMenuNode) print(){
fmt.Println(node.name)
}
//指针接收者
func (node *treeMenuNode) setName(name string){
node.name = name
}
// 遍历
func (node *treeMenuNode) traverse(){
if node == nil {
return
}
node.perent.traverse()
node.print()
node.child.traverse()
}
func main() {
var menu treeMenuNode
menu = treeMenuNode{name:"角色管理"}
menu.perent = &treeMenuNode{}
menu.child = &treeMenuNode{"增加用户",nil,nil}
menu.child.child =new (treeMenuNode)
org := treeMenuNode{name:"xx研发中心"}
org.child = &treeMenuNode{"A组",nil,nil}
nodes :=[]treeMenuNode{
{name:"xxx系统"},
{name:"测试"},
{"系统管理",&menu,&org},
}
fmt.Println(nodes)
fmt.Println("调用自定义方法: ")
menu.print()
menu.child.child.setName("自定义名称")
menu.child.child.print()
var xMenu *treeMenuNode
xMenu.setName("测试参数")
xMenu = &org
xMenu.setName("测试参数2")
xMenu.print()
fmt.Println(" 遍历菜单树")
menu.traverse()
org.traverse()
}
* 包*
命令go 一般采用 CamelCase
首字母大写:public 首字母小写:private
每一个目一个包,main 包包含可执行入口 结构定义的方法必须放在同一个包内,可以使用不同文件
对上面代码进行拆分:
目录结构: |-tree |---entry(main方法包)
main
// 注意包名
package main
import (
"fmt"
"learngo/tree"
)
func main() {
var menu tree.TreeMenuNode
menu = tree.TreeMenuNode{Name: "角色管理"}
menu.Perent = &tree.TreeMenuNode{}
menu.Child = &tree.TreeMenuNode{"增加用户", nil, nil}
menu.Child.Child = new(tree.TreeMenuNode)
org := tree.TreeMenuNode{Name: "xx研发中心"}
org.Child = &tree.TreeMenuNode{"A组", nil, nil}
nodes := []tree.TreeMenuNode{
{Name: "xxx系统"},
{Name: "测试"},
{"系统管理", &menu, &org},
}
fmt.Println(nodes)
fmt.Println("调用自定义方法: ")
menu.Print()
menu.Child.Child.SetName("自定义名称")
menu.Child.Child.Print()
var xMenu *tree.TreeMenuNode
xMenu.SetName("测试参数")
xMenu = &org
xMenu.SetName("测试参数2")
xMenu.Print()
fmt.Println(" 遍历菜单树")
menu.Traverse()
org.Traverse()
}
//结构体
package tree
import "fmt"
type TreeMenuNode struct {
Name string
Perent, Child *TreeMenuNode
}
/*
为结构体定义方法
*/
// 值接收者
func (node TreeMenuNode) Print() {
fmt.Println(node.Name)
}
//指针接收者
func (node *TreeMenuNode) SetName(name string) {
if node == nil {
fmt.Println(" Setting value to nil node. Ignorde.")
return
}
node.Name = name
}
package tree
// 遍历
func (node *TreeMenuNode) Traverse() {
if node == nil {
return
}
node.Perent.Traverse()
node.Print()
node.Child.Traverse()
}