包
1、go语言中,每个目录为一个包
2、main包包含可执行入口
3、为结构定义的方法必须放在同一个包内,可以在不同的文件中
封装
go语言中结构、常量、方法首字母大写,代表public,首字母小写代表private
public的可以支持其他包的调用
如何扩充系统类型或者别人的类型
1、定义别名
2、使用组合
组合例子:
http://c.biancheng.net/view/5128.html
tree包
package tree
import "fmt"
type Node struct {
Value int
Left, Right *Node
}
func (no *Node) SetValue(value int){
no.Value = value
}
func (no *Node) Traverse(){
if no == nil {
return
}
no.Left.Traverse()
no.Print()
no.Right.Traverse()
}
func CreateNode(value int) *Node {
return &Node{ value, nil, nil}
}
func (no Node)Print(){
fmt.Printf("%d ",no.Value)
}
main包中使用组合扩展
package main
import (
"fmt"
tree "tree"
)
type MyTreeNode struct {
node *tree.Node
}
func (myNode *MyTreeNode) postOrder() {
if myNode == nil || myNode.node == nil{
return
}
left := MyTreeNode{myNode.node.Left}
right := MyTreeNode{myNode.node.Right}
left.postOrder()
right.postOrder()
myNode.node.Print()
}
func main() {
var root tree.Node
root = tree.Node{3,nil,nil}
root.Left = &tree.Node{999,nil,nil}
root.Right = &tree.Node{5, nil, nil}
root.Right.Left = new(tree.Node)
root.Left.Right = tree.CreateNode(2)
root.Right.Left.SetValue(4)
root.Traverse()
fmt.Println()
myRoot := MyTreeNode{&root}
myRoot.postOrder()
fmt.Print()
}
组合
Go可以通过组合另一个类型来“继承”它的所有行为,十分直观。
go的组合表达了一种Student是个人,所以Student包含了Person的所有行为,即人能做的事情Student就能做,Student骨子里也是个人
package main
type Person struct {
}
func (p *Person) Say(){
println("I am a person")
}
type Student struct {
Person
}