结构体和方法
- go语言仅支持封装,不支持继承和多态
- go语言没有class 只有struct
- go语言没有构造函数的说法
- 结构创建在堆上还是栈上? 不需要知道
- 在调用的时候,编译器很聪明的,要值还是指针,编译器会帮我们转换
package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func (node treeNode) print(){
fmt.Println(node.value)
}
func (node treeNode) setValue(value int){
node.value = value
}
func (node *treeNode) setValuePtr(value int){
node.value = value
}
func createNode(value int) *treeNode {
return &treeNode{value: value}
}
func main() {
var root treeNode
fmt.Println(root)
root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
node := []treeNode{
{value: 3},
{},
{6, nil, &root},
}
root.right.left = new(treeNode)
root.left.right = createNode(2)
root.setValue(5)
fmt.Println(root)
root.setValuePtr(6)
fmt.Println(root)
fmt.Println(node)
root.print()
var pRoot *treeNode
pRoot.setValue(1)
}
值接受者vs指针接受者
- 要改变内容必须使用指针接受者
- 结构过大考虑指针接受者
- 一致性:如有指针接受者,最好使用指针接受者
- 值接受者是go语言特有的
封装
- 名字使用CamelCase
- 首字母大写:public
- 首字母小写:private
- 大小写是针对包来讲,仅对包管理有效
包
- 每个目录(不含子目录)一个包
- 包名可以和目录名不一样
- main包包含可执行入口,main函数必须在main包里才可以执行
- 为结构定义的方法必须放在同一个包内,但是可以不同的文件
扩展已有类型
type myTreeNode struct {
node *Node
}
func (myNode *myTreeNode) postOrder(){
if myNode ==nil{
return
}
lNode := myTreeNode{myNode.node.Left}
lNode.postOrder()
rNode := myTreeNode{myNode.node.Right}
rNode.postOrder()
myNode.node.Print()
}
type Queue []int
func (q *Queue) Push(v int) {
*q = append(*q, v)
}
func (q *Queue) Pop() int{
v:=(*q)[0]
*q = (*q)[1:]
return v
}
type myTreeNode struct {
*Node
}
func (myNode *myTreeNode) postOrder(){
if myNode ==nil{
return
}
lNode := myTreeNode{myNode.Left}
lNode.postOrder()
rNode := myTreeNode{myNode.Right}
rNode.postOrder()
myNode.Print()
}
func (myTree *myTreeNode) Print(){
}