![77930e2f6ccfea1bbdb0b6783ceff9d7.png](https://i-blog.csdnimg.cn/blog_migrate/9547efa85c28e005209378c42e491d52.jpeg)
结构体
//定义
type treeNode struct {
value int
left, right *treeNode
}
//工厂函数创建
func createNode(value int) *treeNode {
return &treeNode{value: value} //这里返回的是局部变量的地址给外部使用(在go这样子可以的)
}
func main() {
var root treeNode
fmt.Println(root)
//创建
root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.right.left = new(treeNode)
fmt.Println("root:",root)
fmt.Println("root.right:",root.right)
fmt.Println("root.right.left:",root.right.left)
nodes := []treeNode{
{value: 3},
{},
{6, nil, &root},
}
fmt.Println("nodes:",nodes)
root.left = createNode(2)
fmt.Println("createNode:",root)
}
{0 <nil> <nil>}
root: {3 0xc00007c060 0xc00007c080}
root.right: &{5 0xc00007c0a0 <nil>}
root.right.left: &{0 <nil> <nil>}
nodes: [{3 <nil> <nil>} {0 <nil> <nil>} {6 <nil> 0xc00007c020}]
createNode: {3 0xc00007c060 0xc00007c080}
- go仅支持封装,不支持继承和多态
- 结构体的创建:不论地址还是结构本身,一律使用
.
来访问成员 - 结构体放在堆还是栈是由go的运行机制以及环境决定的,编程者不用关心
给结构定义方法
func (node treeNode) print() {
fmt.Print("这是结构体方法打印出来的:",node.value)
}
func (node *treeNode) setValue(value int) {
if node == nil {
fmt.Println("setting value to nil node")
return
}
node.value = value
}
//值不会变
// func (node treeNode) setValue(value int) {
// node.value = value
// }
func (node *treeNode) setValue(value int) {
node.value = value
}
root.print()
fmt.Println("nsetValuen")
root.right.left.setValue(9)
root.right.left.print()
这是结构体方法打印出来的:3
setValue
这是结构体方法打印出来的:9
func(【结构体】) 【函数名】(){}
- func后面括号的是方法接收者(其实就跟函数的返回值一样)
- 只有使用指针才可以改变结构的内容
- nil指针也可以调用方法(可以将值传进来,但是nil的赋值会报错,需要做return处理)