本節重點
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
運行是: