结构体和方法
- go语言仅支持封装,不支持继承和多态
- go语言没有class,只有struct
- 不论地址还是结构本身,一律使用.来访问成员
- 使用自定义工厂函数
- 注意返回了局部变量的地址!
- c++局部变量是分配在栈上面的,函数退出,局部变量销毁。如果要传出去,我们必须在堆上分配,手动释放
type TreeNode struct{
Left,Right *TreeNode
Value int
}
func (node Node) Print() {
fmt.Print(node.Value, " ")
}
func (node *Node) SetValue(value int) {
node.Value = value
}
func CreateNode(value int) *Node {
return &Node{Value: value}
}
func main() {
var root treeNode
fmt.Println(root) nil nil 0
}
给结构体定义方法
- 显示定义和命名方法接收者
- 只有使用指针才可以改变结构内容
- nil 指针也可以调用方法!
func(node TreeNode) print(){
fmt.Print(node.Value)
}
func(node *TreeNode) setValue(value int) {
if node==nil{
fmt.Println("Setting value to nil"+ "node.Ignored.")r
return
}
node.Value=value
}
值接收者和指针接收者
- 要改变内容必须使用指针接收者
- 结构过大也考虑使用指针接收者
- 一致性:如有指针接收者,最好都是指针接收者
- 值接收者是go语言特有
- 值/指针接收者均可接收值/指针
func (node *Node) Traverse() {
node.TraverseFunc(func(n *Node) {
n.Print()
})
fmt.Println()
}
func (node *Node) TraverseFunc(f func(*Node)) {
if node == nil {
return
}
node.Left.TraverseFunc(f)
f(node)
node.Right.TraverseFunc(f)
}
func (node *Node) TraverseWithChannel() chan *Node {
out := make(chan *Node)
go func() {
node.TraverseFunc(func(node *Node) {
out <- node
})
close(out)
}()
return out
}
封装
- 名字一般使用CamelCase
- 首字母大写:public
- 首字母小写:private
- 包
- 每个目录一个包
- main包含可执行入口
- 为结构定义的方法必须放在同一个包内
- 可以是不同文件
扩充系统类型或者别人的类型
GOPATH环境变量
- 默认在~/go(unix,linux),%USERPROFILE%\go(windows)
- 官方推荐:所有项目和第三方库都放在同一个GOPATH下
- 也可以将每个项目放在不同的GOPATH
go get 获取第三方库
- 使用gopm来获取无法下载的包
- go build 来编译
- go install 产生pkg文件和可执行文件
- go run直接编译运行
打开App,阅读手记