GO语言笔记--方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kongshuai19900505/article/details/89739230

1.说明

1)go中虽然没有class,但依旧又method

2)通过显示说明receiver来实现与某个类型的组合

3)只能为同一个包中的类型定义方法

4)receiver可以是类型的值或者指针

5)不存在方法重载

6)可以使用值或指针来调用方法,编译器会自动完成转换

7)从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接受的第一个参数

8)如果外部结构和嵌入式结构存在同名方法,则优先调用外部结构的方法

9)类型别名不会拥有底层类型所附带的方法

10)方法可以调用结构体中的非公开字段

2.封装

1)名字一般使用CamelCase

2)首字母大写:public

3)首字母小写:private

4)上述public和private都是针对于包来说的

3.包

1)每个目录一个包

2)main包包含可执行入口

3)为结构定义的方法必须放在同一个包内

4)可以是不同文件

实例:

代码目录my-code/test-code/创建目录tree,在tree里面创建2个目录,一个是tree另一个是main,每个里面一个文件分别是tree/tree.go,main/main.go

tree.go代码如下

package tree

import "fmt"

type Node struct {
    Value int
    Left, Right *Node
}

func (node Node) Print() {
    fmt.Printf("%d ", node.Value)
}

//go语言结构中没有构造函数,但是可以创建一个工厂函数来负责创建结构
func CreateNode(value int) *Node {
    //go语言中返回一个局部变量的地址是可以给外部使用的
    return &Node{Value: value}
}

//中序遍历
func (node *Node) Traverse() {
    if node == nil {
        return
    }

    node.Left.Traverse()
    node.Print()
    node.Right.Traverse()
}


main.go代码如下:

package main

import "my-code/test-code/tree/tree"

func main() {
    var root tree.Node
    root = tree.Node{Value: 3}
    root.Left = &tree.Node{}
    root.Right = &tree.Node{5, nil, nil}
    root.Right.Left = new(tree.Node)
    root.Left.Right = tree.CreateNode(2)
    //遍历树
    root.Traverse()
}

运行输出:
API server listening at: 127.0.0.1:45880
0 2 3 0 5

4.扩展类型

如何扩充系统类型或者别人的类型

1)定义别名

2)使用组合

例如,上述只实现了中序遍历,如果想用到后续或者前序遍历则需要自己扩充实现,那么如何来做呢?通过组合方式实现如下实例(mian.go):

package main

import (
    "fmt"
    "my-code/test-code/tree/tree"
)

//想要实现tree.Node的后续遍历,那么创建一个结构就可以实现了
type myTreeNode struct {
    node *tree.Node
}

func (myNode *myTreeNode) postOrder() {
    if myNode == nil || myNode.node == nil {
        return
    }

    left := myTreeNode{myNode.node.Left}
    right := myTreeNode{myNode.node.Right}
    left.postOrder()
    right.postOrder()
    myNode.node.Print()
}

func main() {
    var root tree.Node
    root = tree.Node{Value: 3}
    root.Left = &tree.Node{}
    root.Right = &tree.Node{5, nil, nil}
    root.Right.Left = new(tree.Node)
    root.Left.Right = tree.CreateNode(2)
    //中序遍历树
    root.Traverse()
    fmt.Println()
    //后续遍历树
    myRoot := myTreeNode{&root}
    myRoot.postOrder()
}

输出:
API server listening at: 127.0.0.1:22536
0 2 3 0 5
2 0 0 5 3

猜你喜欢

转载自blog.csdn.net/kongshuai19900505/article/details/89739230