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

    xiaoxiao2024-11-11  88

    第三章 面向“对象”


    面向对象

    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)