手记

【Go语言干货】从入门说起,你不得不要知道的面向对象

结构体和方法

  • 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直接编译运行
3人推荐
随时随地看视频
慕课网APP