Golang学习笔记(3)面向“对象”

第三章 面向“对象”


面向对象

  • 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
// 这里不会报错, 但是在setValue函数里 node.value = value 的时候就会报错了
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直接编译运行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值