( ︎ ●—● )

Google资深工程师深度讲解Go语言

2018-03-28 15:15:30

Go 基础

1.byte(4字节8位),rune(char类型,32位,4字节的int32)

2.强制类型转换,go没有隐式类型转换

1
2
3
4
5
6
7
8
9
10
11
12
//勾股定理
a, b := 3, 4 //int
var c int
//Sqrt(float64)
c = math.Sqrt(a*a+b*b)
//>> 类型错误
//必须显示的进行类型转换
c = int(math.Sqrt(float64(a*a+b+b)))
//如果是const且没有定义类型的话不会报错
const a, b = 3,4
c := math.Sqrt(a*a +b*b)
//>> 5

3.iota

1
2
3
4
5
6
7
const(
b=1 <<(10*iota)
kb
mb
tb
pb
)

4.指针

golang只有值传递一种方式
Alt text
下面这种方式看着像引用传递,实际是复制了a的指针地址然后传递达到了引用传递的效果
Alt text

5.Slice

Alt text

  • slice可以向后扩展,但无法向前扩展
  • s[i]不可以超越len(s),向后扩展不能超过cap(s)
  • 添加元素时如果超越cap,系统会重新分配更大的底层数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
s := []int{0,1,2,3,4,5,6,7}
s1 := s[2:6]
// [ 2,3,4,5 ]
s2 := s1[4]
// Error 下标越界了
s3 := s1[3:5]
// [5,6] 向后扩展了一个6
s4 := append(s3,10)
// s4: [5,6,10]
// s: [0,1,2,3,4,5,6,10] 原来的7被append为10了
s5 := append(s4,11)
// s5: [5,6,10,11]
// s: [0,1,2,3,4,5,6,10]当cap不够用的时候,系统已经重新扩展了一个新的slice就不再是操作原来的slice了.原来的slice如果有人用才会存在,否则垃圾回收机制会把回收了.
//copy
s6 := make([]int, 8, 16)
copy(s6, s5)
// [5,6,10,11,0,0,0,0] len:8 cap:16
//delete因为go没有内置的delete方法,所以用append来实现
s7 := append(s5[:3], s5[4:]...)
// [5,6,10,0,0,0,0] len:8 cap:16

6.Map

  • 创建 make(map[string]string)
  • 获取 m[key]
  • key不存在时,获取的是零值
  • value, ok :=m[key]判断值是否存在
  • delete(m, “key”)删除

7.Rune(相当于go的char类型)

  • 使用range遍历pos,rune对
  • 使用utf8.RuneCountString()获取字符数量,而不是直接使用len()
  • 使用len()只是获取到字节长度
  • 使用[]byte获得字节

8.值接收者VS指针接收者

  • 要改变内容必须使用指针接收者
  • 结构体过大也考虑使用指针接收者
  • 一致性:如有指针接收者,最好都是指针接收者
  • 值接收者是go特有的
  • 值/指针接收者均可以接收值/指针

9.接口

Alt text
Alt text
Alt text
Type Assertion
.(type类型)获取interface肚子里的类型

1
r.(*real.Retriver)

10.函数式编程

Alt text
Alt text
Alt text
裴波纳契

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func fibonacci() func() int {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
func main(){
f := fabonacci()
f() //1
f() //1
f() //2
f() //3
f() //5
}

11.资源管理

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

12.测试

Alt text
Alt text

1
2
3
go test #测试当前目录
go test --coverprofile=c.out #生成c.out文件
go tool cover -html=c.out #将c.out文件生成html格式并用浏览器打开

Alt text

1
2
3
go test -bench . #benchmark测试
go test -bench . -cpuprofile=cpu.out
go tool pprof cpu.out

Alt text

1
godoc -http :6060 #开启webservice文档

Alt text

13.Goroutine

Alt text

1
runtime.Gosched()//手动交出控制权

1
go run -race main.go #race condition 数据访问冲突,进行错误检测

Alt text
Alt text
Alt text
Alt text

14.Channel

Alt text
Alt text
Alt text

15.http

Alt text
Alt text
第一种

1
2
3
import _ "net/http/pprof"
//server func ...
//然后就可以通过url/debug/pprof进行访问

第二种

1
2
3
4
5
#会获得30秒的CPU使用率
go tool pprof http://localhost:8888/debug/pprof/profile
#会获得30秒的内存使用率
go tool pprof http://localhost:8888/debug/pprof/heap
#期间访问想要测试的http request,30秒后进入prof模式,可以使用web进行查看

16.广度优先算法

1.探索顺序:上左下右
2.结点的三种状态:

  • 已经发现还未探索(最关键,这些未探索的点需要排队,不能急于探索必须轮到才能探索)
  • 已经发现并且探索
  • 连发现都没发现

Alt text
Alt text
Alt text
Alt text
Alt text
Alt text
一层一层往外递进,确保每到一个点都是用最短的路径到达
Alt text
Alt text
Alt text
Alt text
Alt text
最终倒过来走就是最短路径
3.结束条件:

  • 走到终端
  • 队列为空(死路)