Go物件導向篇

來源:互聯網
上載者:User

本節重點

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

[admin@localhost ~]$ cd /opt/go[admin@localhost go]$ pwd/opt/go[admin@localhost go]$ echo $GOPATH/home/admin/go[admin@localhost 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來運行了)

[root@localhost go]# gopm help

[root@localhost 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 mainimport (    "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 treeimport "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 treeimport "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: 5Max node value: 5truefalseProcess finished with exit code 0

 

 queue

先做準備工作

代碼結構如下:

package mainimport (    "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

 

 輸出是:

12false3trueProcess finished with exit code 0

 

package queueimport "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

 運行是:

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.