百度網盤golang
提取碼:qhhv 編程
這是劍指offer的一道題。數組
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出以下圖所示的二叉樹並輸出它的頭結點。架構
思路以下:併發
package main import ( "fmt" ) // 重建二叉樹 type Node struct { value int64 left *Node right *Node } func main() { preOrder := []int64{1,2,4,7,3,5,6,8} inOrder := []int64{4,7,2,1,5,3,8,6} tree := constructBTree(preOrder, inOrder) //將構建好的二叉樹 輸出先序遍歷和中序遍歷的結果 用於檢驗 preCatTree(tree) inCatTree(tree) } //重建二叉樹 func constructBTree(preOrder, inOrder []int64) *Node{ l := len(preOrder) if l == 0{ return nil } root := &Node{ value:preOrder[0], } if l == 1{ return root } leftLen := 0 rightLen := 0 for _,v := range inOrder{ if v == root.value{ break } leftLen++ //根節點以前的爲左子樹長度 } rightLen = l - leftLen - 1 //右子樹長度 if leftLen > 0{ //fmt.Println("左子樹",preOrder[1:leftLen+1], inOrder[0:leftLen]) //可打開註釋查看詳細過程 root.left = constructBTree(preOrder[1:leftLen+1], inOrder[0:leftLen]) } if rightLen >0{ //fmt.Println("右子樹",preOrder[leftLen+1:], inOrder[leftLen+1:]) root.right = constructBTree(preOrder[leftLen+1:], inOrder[leftLen+1:]) } return root } func preCatTree(t *Node) { fmt.Println(t.value) if t.left!=nil{ preCatTree(t.left) } if t.right!=nil{ preCatTree(t.right) } } func inCatTree(t *Node) { if t.left!=nil{ inCatTree(t.left) } fmt.Println(t.value) if t.right!=nil{ inCatTree(t.right) } }
作的
1.格式輸出異步
- %T 類型
- %t 布爾
- %d 10進制整數
- %x 16進制整數
- %f 浮點數
- %s 字符串
2.接口ide
一個類若是實現了一個接口的全部函數,那麼這個類就實現了這個接口,即這個類的對象可使用接口的方法。函數
3.init性能
包的init 是初始化函數,在包引入的時候就會調用,一個包能夠寫多個init函數。翻譯
init 函數先於main函數自動執行,不能被其餘函數調用;
init 函數沒有輸入參數、返回值;
每一個包能夠有多個init函數;
同一個包的init執行順序,golang沒有明肯定義,編程時注意不要依賴這個執行順序,不一樣包的init函數的執行順序依照包導入的依賴關係決定執行順序。
4.執行順序
5.多參數函數
6.類型轉換
類型(變量)
7.引用
獲取指針類型的所指向的值, 可使用: 「*」取值符號。
好比 var p *int, 使用p獲取p指針,slice、map、chan都是引用類型。
內置函數 new 計算類型大小,爲其分配零值內存,返回指針。而 make 會被編譯器翻譯 成具體的建立函數,由其分配內存和初始化成員結構,返回對象而非指針。
8.切片
9.類成員函數
10.接口
若是兩個接口有相同的方法列表,那麼他們就是等價的,能夠相互賦值。
11.鎖
當一個goroutine(協程)得到了Mutex後,其餘gorouline(協程)就只能乖乖的等待,除非該gorouline釋放了該Mutex
RWMutex在 讀鎖 佔用的狀況下,會阻止寫,但不阻止讀
RWMutex在 寫鎖 佔用狀況下,會阻止任何其餘goroutine(不管讀和寫)進來,整個鎖至關於由該goroutine獨佔
12.通道
若是給一個 nil 的 channel 發送數據,會形成永遠阻塞
若是從一個 nil 的 channel 中接收數據,也會形成永久愛阻塞
給一個已經關閉的 channel 發送數據, 會引發 pannic
從一個已經關閉的 channel 接收數據, 若是緩衝區中爲空,則返回一個零值
無緩衝的 channel是同步的,而有緩衝的channel是非同步的。
13.通道關閉
通道關閉後,若是通道里面仍然有值,就會繼續讀取,直到沒有值,讀取到false
給一個關閉的通道傳遞值會引發panic
若是給一個 nil 的 channel 發送數據,會形成永遠阻塞,靠協程進行疏通
若是從一個 nil 的 channel 接收數據,會形成永久阻塞,靠協程進行疏通
14.斷言類型
x.(T)被稱爲斷言類型,這裏x表示一個接口的類型和T表示一個類型
15.繼承
在一個結構體裏面加一個架構體,就是繼承
16.switch
go 當中switch語句和其餘語言相似,只是有一個特殊的地方,switch後面能夠不跟表達式
17.make與new
new返回的是指針
make用於slice map channel初始化,返回實例
18異同Printf(),Sprintf(),FprintF()
Printf()格式化輸出到屏幕
Sprintf()格式化輸出到變量
FprintF()輸出到文件
19.數組與切片
數組定長值傳遞長度也是類型的一部分
切片變長引用傳遞 make初始化
20.數組與切片的傳遞
數組是值傳遞,只能硬改值,若是是調用函數在函數內改變值的話,就不會達到目的。
切片是引用值,能夠硬改,若是調用函數在函數內部的變化,也會反映到函數外部,它意味着[]切片類型默認使用了*切片。
21.runtime.GOMAXPROCS(邏輯CPU數量)
runtime.GOMAXPROCS 的做用是:調整併發的運行性能。 runtime.Gosched()
<1: 不修改任何數值。
=1: 單核心運行。
>1: 多核心運行。
22.defer執行順序
23.切片
24.異步全局與局部變量
均爲輸出10, 第一個go func中i是外部for的一個變量,地址不變化。遍歷完成後,最終i=10。
故go func執行時,i的值始終是10。
25.接口
結構體的空不是空 不等於nil
package main import ( "fmt") type People interface {}type Student struct {} func live() People { // 這個是結構體類型的 var stu *Student return stu // 這個是接口類型的 var stu People return stu} func main() { var a People fmt.Println(live()) fmt.Println(a) if a == nil { fmt.Println("A") } else { fmt.Println("B") } if live() == nil { fmt.Println("C") } else { fmt.Println("D") } b:=live() if b == nil { fmt.Println("E") } else { fmt.Println("F") }}// <nil>// <nil>// A// D