第三章 面向“对象”
面向对象
go语言仅支持封装, 不支持继承和多态go语言没有class,只有struct
结构的创建
type treeNode
struct {
value
int
left
, right
*treeNode
}
func createTreeNode(value
int) *TreeNode
{
return &TreeNode
{ value
: value
}
}
root
:= TreeNode
{ value
: 3 }
root
.left
= &TreeNode
{}
root
.right
= &TreeNode
{ 5, nil, nil }
root
.right
.left
= new( TreeNode
)
root
.left
.right
= createTreeNode( 2 )
一律使用 “.” 访问成员使用自定义工厂函数( createTreeNode )可以返回局部变量的地址
为结构定义方法
显示定义和命名方法接收者
func (node TreeNode
) print() {
fmt
.Print( node
.value
)
}
使用指针作为方法的接收者 只有指针才可以改变Struct内容
func (node
*TreeNode
) setValue(value
int) {
node
.value
= value
}
nil指针也可以调用方法
var root
*TreeNode
root
.setValue(100)
外部调用函数的时候
, 不用在意对象是否为
nil, 但是函数实现内部一定要注意
值接收者 vs 指针接收者
要改变内容必须使用指针接收者结构过大也考虑使用指针接收者一致性 : 如有指针接收者, 最好都是指针接收者值接收者是go语言特有值/指针接收者均可接收值/指针
封装
Public方法首字母大写Private方法首字母小写
包
每个目录一个包main包包含可执行入口为结构定义的方法必须放在同一个包内, 但是可以是不同的文件
1. 如何扩充系统类型或者别人的类型
定义别名
type Queue
[]int
func (q
*Queue
) Push(v
int) {
*q
= append(*q
, v
)
}
func (q
*Queue
) Pop() int {
head
:= (*q
)[0]
*q
= (*q
)[1:]
return head
}
func (q
*Queue
) IsEmpty() bool {
return len(*q
) == 0
}
使用组合
type myTreeNode
struct {
node
*tree
.TreeNode
}
GOPATH环境变量
默认在~/go(linux), %USERPROFILE%\go(windows)官方推荐:所有项目和第三方库都放在同一个GOPATH下
1. go get获取第三方库
go get命令使用gopm来获取无法下载的包
go get
-v github
.com
/gpmgo
/gopm
2. go build 来编译
3. go install 产生pkg文件和可执行文件
4. go run直接编译运行