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
}