go的包

封装

  • 包内变量、方法及函数,如果希望暴露给外部,首字母要大写;如果是私有的,使用小写字母开头
  • 每个目录只有一个包
  • main包包含可执行入口(package main 就表示这是一个program,而不是一个package)
  • 为struct定义的方法必须在一个包内,可以在不同的文件内

包的扩展

定义别名, 组合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

// /Tree/Node.go
type TreeNode struct {
value int
left, right *TreeNode
}

func (MyNode TreeNode) print() {
fmt.Println(MyNode.value)
}

// /Tree/MyNode.go
type MyNode struct{
node *TreeNode
}

func (MyNode *MyNode ) RightReversal() {
if MyNode == nil {
fmt.Printf("node does not exist")
return
}
MyNode.node.right.print()
MyNode.node.print()
MyNode.node.left.print()
}

var node = TreeNode{value: 1}
node.setVal(4)
node.left = &TreeNode{value:12}
node.right = &TreeNode{value:7}

var mine_node = &MyNode{&node}
mine_node.RightReversal()


// /Queue
type Slice []interface{}

// 如果出入参不限制类型,可以在写入的时候限制
func (q *Slice) Add(val interface{}) {
*q = append(*q, val.(int))
}

// 虽然入参没有限制类型,但这个slice仍然只能存储int类型
func (q *Slice) Pop() interface{} {
head := (*q)[0]
*q = (*q)[1:]
return head.(int)
}