study_go_day7_结构体和方法

package main

import "fmt"

/*面向对象

* go语言仅支持封装,不支持继承和多态,继承和多态用接口来做,面向接口编程

* go语言没有class,只有struct

* 不论地址还是结构体本身,一律使用"."来访问成员

*/

//结构体定义

type TreeNodestruct {

Value int

Left,Right *TreeNode

}

/*

*为结构体定义方法,定义在结构体外部

*(node TreeNode)接收者

*值传递

*与一般函数的区别是把参数拿到了前面

*编译器知道你是要值还是要指针,不加指针是值传递不能改变值

*显示定义和命名方法收者

*使用指针才可以改变结构内容

*nil指针也能调用方法

*要改变内容必须使用指针接收者

*结构过大建议使用指针接收者

*一致性:有指针接收者,最好都用指针接收者

*值接受者是go语言特有的

*值/指针接收者均可接收值/指针

*/

func (node TreeNode) print()  {

fmt.Println(node.Value)

}

func (node *TreeNode) setValue(value int)  {

if node == nil {

fmt.Println("node 为 nil")

return

  }

node.Value = value

}

//中式遍历

func (node *TreeNode) traverse()  {

if node == nil {

return

  }

node.Left.traverse()

node.print()

node.Right.traverse()

}

//工厂函数,go可以返回局部变量的地址给外部用,不需要知道内存分配在堆上还是栈上,由go环境来决定分配在哪里,go语言有垃圾回收机制,编译器会自动把没有用的回收掉

func createTreeNode(value int) *TreeNode  {

return &TreeNode{Value:value}

}

func main() {

//var root TreeNode

  root := TreeNode{Value:3}

fmt.Println(root)

root.Left = &TreeNode{}//left类型是指针所以要取地址

  root.Right = &TreeNode{5,nil,nil}

root.Right.Left = new(TreeNode)//new内建函数,返回一个TreeNode的地址

  root.Left.Right = createTreeNode(9)

fmt.Println(root)

root.print()

root.setValue(7)

root.print()

p := &root

p.setValue(100)

p.print()

var  d *TreeNode

d.setValue(100)

d = &root

d.setValue(400)

d.print()

root.traverse()

nodes := []TreeNode{

{Value:3},

{},

{6,nil,&root},

}

fmt.Println(nodes)

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容