面向对象
type TreeNode struct{
Left,Right *TreeNode
Value int
}

func (root *TreeNode) traverse(){
if root == nil{
return
}
root.Left.traverse()
fmt.Ptint(root.Value)
root.Right.traverse()
}

·go语言仅支持封装,不支持继承和多态
·go语言没有class,只有struct
结构的定义
type TreeNode struct{
Left,Right *TreeNode
Value int
}

结构的创建
root := TreeNode{Value:3}
root.Left = &TreeNode{}
root.Right = &TreeNode{nil,nil,5}
root.Right.Left = new(TreeNode)
·不论地址还是结构本身,一律使用.来访问成员
func createTreeNode(value int) *TreeNode{
return &TreeNode{value:value}
}
root.Left.Right = createTreeNode(2)
·使用自定义工厂函数
·注意返回了局部变量的地址
为结构定义方法
func (node TreeNode) print(){
fmt.Ptint(node.Value)
}
·显示定义和命名方法接收者
使用指针作为方法接收者
func (node *TreeNode) setValue(value int){
node.Value = value
}
·只有使用指针才可以改变结构内容
·nil指针也可以调用方法
·要改变内容必须使用指针接收者
·结构过大也考虑使用指针接收者
·一致性:如有指针接收者,最好都是指针接收者
·值接收者是Go语言特有
·值/指针均可以接收值/指针

包和封装
封装
·名字一般使用CamelCase
·首字母大写:public
·首字母小写:private

·每个目录一个包
·main包包含可执行入口
·为结构定义的方法必须放在同一个包内
·可以是不同文件
如何扩充系统类型或者别人的类型
·定义别名
·使用组合

依赖管理
·依赖的概念
·依赖管理的三个阶段GOPATH,GOVENDOR,go mod
GOPATH
·默认在~/go(unix,linux),%USERPROFILE%\go(windows)
·每个项目都有自己的vendor目录,存放第三方库
·大量第三方依赖管理工具:glide,dep,go dep,...
go mod
·由go命令统一的管理,用户不必关心目录结构
·初始化:go mod init
·增加依赖:go get
·更新依赖:go get[@v...],go mod tidy
·将就项目迁移到go mod:go mod init,go build ./...