第四章 go面向“对象”

第四章 面向“对象”

一.结构体和方法

1).面向对象
1.go语言仅支持封装,不支持继承和多态
2.go语言没有 class,只有 struct

2).结构体的定义

1
2
3
4
5
6
7
8
type treeNode struct {
value int
left, right *treeNode
}
root := T reeNode{Value:3}
root.Left = &TreeNode{}
root. Right = &TreeNode{nil, nil, 5}
root. Right.Left = new(TreeNode)

1.不论地址还是结构本身,一-律使用.来访问成员
3).结构的创建

1
2
3
4
func createTreeNode(value int) *TreeNode {
return &TreeNode{Value: value}
}
root.Right.Left = createTreeNode(2)

1.使用自定义工厂函数
2.注意返回了局部变量地址
4).结构创建在堆上还是栈上?
对比c++局部变量分配在栈上,函数退出局部变量销毁,传出去的话在堆上分配,需要手动销毁
Go 语言分配在堆上还是栈上?不一定,这个是由 go 语言的编译器、运行环境决定的。如果堆上分配的话就会参与垃圾回收

5).为结构定义方法

1
2
3
func (node TreeNode) print() {
fmt.Print(node.Value)
}

1.显示定义和命名方法接收者

6).用指针作为方法接收者

1
2
3
func (node *TreeNode) setValue(value int) {
node.Value = value
}

1.只有使用指针才可以改变结构内容
2.nil 指针也可以调用方法!

7).值接收者 vs 指针接收者
1.要改变内容必须使用指针接收着
2.结构过大也考虑指针接收者
3.一致性:如果有指针接收者,最好都是指针接收者
4.值接收者 是 go 语言特有
5.值/指针接收者均可接收值/指针

二.包和封装

1).封装
1.名字 go 语言一般使用 CamelCase
2.首字母大写:public
3.首字母小写:private

2).包
1.每个目录一个包
2.main 包包含可执行入口
3.为结构定义的方法必须放在同一个包内
4.可以是不同文件

三.拓展已有类型


1.如何扩充系统类型或者别人的类型
定义别名
使用组合

四.GOPATH 以及目录结构

1.goget 获取第三方库
goget 命令演示
go get golang.org/x/tools/cmd/goimports
go get github.com/gpmgo/gopm

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

src
git repsitory 1
git repsitory 2
pkg
git repsitory 1
git repsitory 2
bin
执行文件1,2,3

1
2
3
4
5
import (
"fmt"
"golang . org/x/tools/ container/intsets"
" imooc. com/ ccmouse/learngo/tree"
)