1、面向对象:
1-1、go语言仅支持封装,不支持继承和多态。
1-2、go语言没有class,只有struct。
2、结构对定义:
type TreeNode struct {
Left, Right *TreeNode
Value int
}
3、结构对创建:
3-1、不论地址还是结构本身,一律使用.来访问成员。例:
root = TreeNode{value: 3}
root.Left = & TreeNode{}
root.Right = & TreeNode{5,nil,nil}
root.Right.Left = new(TreeNode)
3-2、使用自定义工厂函数。
3-3、注意返回例局部变量对地址。例:
func createTreeNode(value int) *TreeNode {
return &TreeNode {Value:value}
}
root.Left.Right = createTreeNode(2)
3-4、为结构定义方法:显示定义和命名方法接受者。例:
func (node treeNode) print() {
fmt.Print(node.value)
}
3-5、使用指针作为方法接收者:
3-5-1、只有使用指针才可以改变结构内容(如有指针接收者,尽量使用指针接收者)。
3-5-2、nil 指针也可以调用方法。
例:func (node *treeNode) setValue(value int) {
node.value = value
}
3-6、值接受者 VS 指针接受者:
- 要改变内容必须使用指针接受者。
- 结构过大也考虑使用指针接收者。
- 一致性:如有指针接受者,最好都是指针接受者。
- 值接收者:是go语言特有。
- 值/指针接受者均可接受值/指针。
type treeNode struct {
value int
left, right *treeNode
}
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 createNode(value int) *treeNode {
return &treeNode{value: value}
}
func (node *treeNode) traverse() {
if node == nil {
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
func nodesFun() {
var root treeNode
root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5,nil,nil}
root.right.left = new(treeNode)
root.left.right = new(treeNode)
nodes := []treeNode{
{value: 3},
{},
{6,nil,&root},
}
fmt.Println(nodes) // [{3 <nil> <nil>} {0 <nil> <nil>} {6 <nil> 0xc00011a018}]
root.print() // 打印结果:3
fmt.Println()
root.right.left.setValue(4) // 打印结果:4
root.right.left.print()
fmt.Println()
root.print() // 3
root.setValue(100)
fmt.Println()
var pRoot *treeNode
pRoot.setValue(200) // Setting value to nil node
pRoot = &root
pRoot.print() // 100
fmt.Println()
root.traverse() // 0010045
}
func main() {
nodesFun()
fmt.Println()
}