百度网盘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