golang学习笔记-基础篇(持续更新……)

一、零碎知识点

  1. 脚手架

1) 本地godoc文档
在cmd中执行命令godoc -http=:6060即可在本地的6060端口查看文档,和访问官网一样的。如下:
golang学习笔记-基础篇(持续更新……)_第1张图片
2. go test
1 ) go test -v .\example_test.go 执行用例,-v 表示显示执行的结果,以下加v和不加v:
在这里插入图片描述
golang学习笔记-基础篇(持续更新……)_第2张图片
2 ) //output
golang学习笔记-基础篇(持续更新……)_第3张图片

二、面试知识点

  1. 基础知识点

1) new和make的区别
new内建函数,初始化一个指向类型的指针(*T),传递给new的是一个类型,返回的是这个新分配的零值的指针
make内建函数,作用于slice,map或chan,初始化并返回引用(T),返回一个初始化的实例
2 ) 数组和切片的区别
数组是值传递,内置类型;具有固定的长度且拥有0个后者多个相同数据类型元素的序列。
切片,表示拥有相同类型元素的可变长度的序列,有三个属性:指针,长度和容量,不需要指定大小,是地址传递,在追加元素时如果容量cap不足时将按len的2倍扩容
3)go中的引用类型
包括,数据切片、字典、通道、接口interface
4)go触发panic的场景
使用空指针,下标越界,调用panic函数
5)defer函数
defer函数属于延迟函数执行,多个defer函数之间按照LIFO先进后出的顺序执行
6)堆和栈的问题
i. go语言的编译器会选择把一个变量放在堆上还是栈空间上,编译器会做逃逸分析,当编译发现变量的作用域没有逃逸函数的范围,就可以在栈上,反之则必须分配在堆上
ii. 以下情况,变量一定被分配到堆上
a.如果变量被取地址,并且被逃逸分析识别为“逃逸到堆”
b.如果一个变量很大
7) 性能调试
i. 查看panic的调用栈
ii. pprof
iii. 火焰图(配合压力测试)
iv. 使用go run -race 或者 go build -race 来进行竞争检测

  1. channel的特性

1)给nil的channel写数据,永远阻塞
2)从一个nil的channel读数据,永远阻塞
3)给一个close的channel写数据,引起panic
4)从关闭的channel中读数据,如果缓冲区为空,返回一个nil
5)无缓冲的channel是同步的,而有缓冲区的channel是异步的
ch := make(chan interface{}) 和 ch := make(chan interface{},1)的区别?
无缓冲的必须要一直有接收者才行,要么会阻塞数据写入;
有缓冲的当写入的一个值尚未被拿走的时候,写数据失败,才会被阻塞。

  1. 协程的调度原理

1)协程
协程拥有自己的寄存器和上下文栈。协程调度切换时保存寄存器和上下文状态,再次切换回来时恢复寄存器和上下文。这个切换是在go的runtime调度的,无需系统内核切换,消耗的资源(cpu)就很小了,因此比较线程和进程来说,协程拥有强大的并发能力。
2)go的调度器——GPM模型
go的调度器内部有四个重要的结构:M、P、S、Sched:
M:表示内核级线程,一个M就是一个线程,goroutine就是运行在M之上的;M内部维护了许多小对象内存cache、当前执行的goroutine、随机数发生器等
G:表示一个goroutine,它拥有自己的栈,以及其他的信息,用于调度
P:Processor,主要用来直接goroutine,维护了一个goroutine队列,里面存储了所有需要执行的goroutine
Sched:调度器,他维护存储有M和G的队列以及调度器的一些状态信息
3)调度实现

  1. gc的理解

未完待续。。。

  1. 常用的模型

1)select+for

你可能感兴趣的:(#,golang)