GO語言筆記--方法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章