0%

Go基础之包和封装

封装

通过命名来实现封装

  • 名字一般使用CamelCase
  • 首字母大写:public
  • 首字母小写:private

相对于 包 而言,若一个外部的包想要访问本包内定义的结构,和 结构的方法(不仅仅是结构,定义的一般方法若想被其他包使用,也是要大写首字母的),这些命名,包括结构内变量的命名都要采用大写。

但是在同一个包下的内容可以随便调用。

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
package tree

import "fmt"

type Node struct {
Value int
Left, Right *Node
}

func (node Node) Print() {
fmt.Print(node.Value, " ")
}

func (node *Node) SetValue(value int) {
if node == nil {
fmt.Println("Setting Value to nil " +
"node. Ignored.")
return
}
node.Value = value
}

func CreateNode(value int) *Node {
return &Node{Value: value}
}

  • 每个目录一个包,只能是同一种包
  • main包包含可执行入口-- main函数,只有main包才能有main函数
  • 为结构定义的方法必须放在同一个包内
  • 可以是同一个包内的不同文件,对包外来说,只要知道包名,都可以使用,不需要知道文件名

使用时,import导入的是存放包的目录名,同一个目录下只能有一种包名,用来表示包内文件的关系,以及被其他包使用时的开头 包名.方法或变量。但是为了不产生歧义,最好使用的时候,包名和目录名设置成一致的即可。

如何扩充系统类型或者别人的类型

在含有继承的语言中,可以通过继承的方式来扩充原有的功能,但是在go中是没有继承的概念的。Go采用以下两种方式来扩充:

  • 定义别名
  • 使用组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 使用组合的方式来完成    扩充自定义的treeNode结构,增加后序遍历的功能
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()
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 使用别名的方式来完成  扩充[]int切片类型,提供Push、Pop、IsEmpty的功能
package queue

// A FIFO queue.
type Queue []int // 使用type 定义了[]int类型的别名 Queue

// Pushes the element into the queue.
// e.g. q.Push(123)
func (q *Queue) Push(v int) {
*q = append(*q, v)
}

// Pops element from head.
func (q *Queue) Pop() int {
head := (*q)[0]
*q = (*q)[1:]
return head
}

// Returns if the queue is empty or not.
func (q *Queue) IsEmpty() bool {
return len(*q) == 0
}

GOPATH环境变量

  • 默认在~/go(Unix,Linux)
  • 官方推荐:所有项目和第三方库都放在同一个GOPATH下
  • 也可以将每个项目放在不同的GOPATH
  • GO在 编译 的时候会自动到每个GOPATN下找到自己所依赖的包

正常情况下 go get golang.org/x/tools/cmd/goimports

使用gopm来获取无法下载的包

go get -v github.com/gpmgo/gopm

  • go build 来编译
  • go install 产生pkg文件和可执行文件
  • go run 直接编译运行

gopath下三个文件夹,bin 放go install的可执行文件, pkg 存放包文件,src 为项目源代码,也是可以使被掉