歡迎光臨
我們一直在努力

Go物件導向篇

文章摘要: node.TraverseFunc(func(node *Node) {root.TraverseFunc(func(node *tree.Node) {

本節重點

1)GO安裝路徑為為GOROOT  如何設定GOPATH  在PATH中新增GOPATH/bin目錄

2)GOPATH目錄(這裏為/home/admin/go)下有三個資料夾bin  pkg  src但是一般是src是我自己建立,其餘不是

如果非要建立這幾個資料夾,比如建立了pkg就涉及到IDEA中go run 時候可能go install會被拒絕寫入由我自己建立的pkg

3)IDEA工程儲存路徑(這裏為 /home/admin/go/src/learngo)我自己注意:最好下次儲存為 /home/admin/go/src/ycx/learngo

4)無法直接獲取golang的包因此使用工作gopm(獲取時候採用go get命令 但是一定要記得安裝了git)

5)IDEA中執行某個程式時候如果報錯(請自行檢視是否到該包目錄下go install了,如果沒有會報錯關於linux_amd64的)

6)GPATH下:go build來編譯  go install產生pkg檔案和可執行檔案  go run直接編譯執行

GOPATH

[[email protected] ~]$ cd /opt/go
[[email protected] go]$ pwd
/opt/go
[[email protected] go]$ echo $GOPATH
/home/admin/go
[[email protected] go]$ gedit /etc/profile

GOPATH

重點關注:GOPATH以及設定PATH關於GOPATH的

go get

在配置的GOPATH目錄下執行命令:go get -v github.com/gpmgo/gopm

注意1:如果不能執行請檢視自己是否安裝了 git

注意:如果出現錯誤提示如下(請將src目錄下的github.com資料夾刪除使用命令為:rm -rf  資料夾名字

安裝gopm完畢檢視目錄下一些檔案:(此時說明gopm安裝完畢,可以通過檢視gopm的help來執行了)

[[email protected] go]# gopm help

[[email protected] go]# gopm help get

使用gopm:

使用一下命令第一次不會出現一下問題

開啟IDEA可以檢視GOPATH已經出現:

執行go build命令來build需要的goimports將其裝在bin目錄下面去

注:這裏它會做兩件事情(第一件:將IDEA裡的import兩個空行 第二件:是在golang.org 的x目錄下多很多東西)

使用示例

我們可以來使用一下:使用intsets.Sparse{}   下面是tree的總程式碼

注意:執行程式treeentry.go執行程式出錯:(這是由於自己認為建立了pkg,如果不是則不會報這個錯誤)

解決辦法:

tree

目錄結構:

package main

import (
    "fmt"

    "learngo/tree"

    "golang.org/x/tools/container/intsets"
)

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 testSparse() {
    s := intsets.Sparse{}

    s.Insert(1)
    s.Insert(1000)
    s.Insert(1000000)
    fmt.Println(s.Has(1000))
    fmt.Println(s.Has(10000000))
}

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.Right.Left.SetValue(4)

    fmt.Print("In-order traversal: ")
    root.Traverse()

    fmt.Print("My own post-order traversal: ")
    myRoot := myTreeNode{&root}
    myRoot.postOrder()
    fmt.Println()

    nodeCount := 0
    root.TraverseFunc(func(node *tree.Node) {
        nodeCount++
    })
    fmt.Println("Node count:", nodeCount)

    c := root.TraverseWithChannel()
    maxNodeValue := 0
    for node := range c {
        if node.Value > maxNodeValue {
            maxNodeValue = node.Value
        }
    }
    fmt.Println("Max node value:", maxNodeValue)

    testSparse()
}

entry.go
package tree

import "fmt"

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

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

func (node *Node) SetValue(value int) {
    if node == nil {
        fmt.Println("Setting Value to nil " +
            "node. Ignored.")
        return
    }
    node.Value = value
}

func CreateNode(value int) *Node {
    return &Node{Value: value}
}

node.go
package tree

import "fmt"

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
}

traversal.go

輸出是:

In-order traversal: 0 2 3 4 5 
My own post-order traversal: 2 0 4 5 3 
Node count: 5
Max node value: 5
true
false

Process finished with exit code 0

queue

先做準備工作

程式碼結構如下:

package main

import (
    "fmt"
    "learngo/queue"
)

func main() {
    q := queue.Queue{1}

    q.Push(2)
    q.Push(3)
    fmt.Println(q.Pop())
    fmt.Println(q.Pop())
    fmt.Println(q.IsEmpty())
    fmt.Println(q.Pop())
    fmt.Println(q.IsEmpty())
}

main.go
package queue

// A FIFO queue.
type Queue []int

// Pushes the element into the queue.
//         e.g. q.Push(123)
func (q *Queue) Push(v int) {
    *q = append(*q, v)
}

// Pops element from head.
func (q *Queue) Pop() int {
    head := (*q)[0]
    *q = (*q)[1:]
    return head
}

// Returns if the queue is empty or not.
func (q *Queue) IsEmpty() bool {
    return len(*q) == 0
}

queue.go

輸出是:

1
2
false
3
true

Process finished with exit code 0
package queue

import "fmt"

func ExampleQueue_Pop() {
    q := Queue{1}
    q.Push(2)
    q.Push(3)
    fmt.Println(q.Pop())
    fmt.Println(q.Pop())
    fmt.Println(q.IsEmpty())

    fmt.Println(q.Pop())
    fmt.Println(q.IsEmpty())

    // Output:
    // 1
    // 2
    // false
    // 3
    // true
}

queue_test.go

執行是:

未經允許不得轉載:頭條楓林網 » Go物件導向篇