经过参加一些面试之后,个人的一些理解。其实这些知识点都懂,但是很少有机会描述,所以面试的时候一问就描述不清楚了,所以写一篇博客组织下自己的语言,能够清楚表述。也是惭愧,这些很基础的东西,我竟然没有经常复习。
---更新 2019年07月04日
GO关键字有哪些?(至少应该是要倒背如流吧)
GO内置函数有哪些?(至少应该是要倒背入流吧)
能清楚的描述每个关键字和内置函数的作用以及一些场景?
defer?
new和make的区别?
panic和error的区别?
无缓冲和有缓冲的区别?
unsafe.Pointer和uintptr的区别?
GO应用反射场景?
CGO编程?
GO关键字?
GO的关键字一共25个,但是就25个就足够完成现在编程的一切所需,当你分析每个关键字结合当下的编程所需的时候,就会发现GO的设计就是一件艺术品,不多不少。
包管理:package、import
变量:var、interface、struct、map、type
常量:const
函数:func、return、defer
循环:for、continue、break、range、if、else、switch、case、default、fallthrough、goto
并发:go、chan、select
对于包管理的话,有package、import,对于变量的话有var、interface、struct、map,类型定义有type。常量的话有const。函数的话有func、return、defer。循环的话,go中的for具有c语言中for+break的所有功能,用一个for完成循环,更加简洁,if、else、switch、case、default、fallthrough来完成选择。
GO内置函数?
new、make、append、copy、delete、close、len、cap、panic、recover
可以将内置函数进行分类,可以得出以下几个分类:
1)新建:new、make
2)添加:append
3)复制:copy
4)删除:delete
5)关闭:close
6)计算长度:len、cap
7)异常处理:panic、recover
从上面三个分类中,出现了有2个内置函数,说明要区分这两个函数的不同。
(1)new和make的区别?
第一个区别:针对对象不同,new的传入是可以任意类型的,make的传入类型只能是slice、map、chan
第二个区别:返回对象不同,new返回的是一个指针,make返回的是引用
第三个区别:操作不同,对于slice、map、chan来说,new只为对象分配内存,make是为对象分配内存和初始化操作
(2)len和cap的区别?
第一个区别:传入对象不同,len可以是string、slice、map、chan,但是cap只能是slice
第二个区别:功能不同,len是计算已用长度,cap是计算对象分配的容量
(3)panic和error的场景?
panic是用来处理异常情况,error是用来处理错误情况,什么是异常?什么是错误?异常就是你知道会出现错误,但是你不知道是什么错。错误就是你知道会发生什么错,这是这两者之间的区别。
无缓冲和有缓冲的区别?
无缓冲的话,向这个channel写入之后,如果再向这个写满的channel写入数据的话,会被一直阻塞,直到有一个协程去读取channel。
有缓冲的话,只有向channel写满的情况下写入才会造成阻塞的情况
无缓冲:
c := make(chan int, 0)等价
c := make(chan int)
有缓冲:
c := make(chan int, n) // n > 0
说明:无缓冲make(chan int)和有缓冲make(chan int, 1)的区别
向make(chan int)放入一个值的时候,就会被阻塞,直到其他地方有从这个无缓冲中读取内容为止。而向make(chan int, 1)里面放入一个值的时候,不会立即阻塞,直到后面这边满为止,再向里面放一个值时才会阻塞。
defer功能和使用场合?
defer用于退出执行,比如打开文件之后,需要关闭,以及打开数据库之类的操作,主要是应对在操作过程中遇到某些情况,如需要返回错误或发生panic的时候,关闭操作依然能被执行,关于defer的效率问题,可以看我的另一篇博客:,defer对程序的效率影响可以忽略不计。
unsafe.Pointer和uintptr的区别?
go指针详情可以参考我的博客文章:https://www.jianshu.com/writer#/notebooks/28359403/notes/33744906
区别一:功能不同,unsafe.Pointer不能进行指针运算,用于充当普通指针和uintptr的转换桥梁,uintptr可以进行指针运算
区别二:实质不同,GC将unsafe.Pointer看成一个指针引用,uintptr不被GC当成指针,也就是当一个地址被uintptr指向外,没有被其他所指向,则会被GC回收。
GO应用反射场景?
有两种情况:
1)不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射。例如:桥接模式。
2)不知道传入函数的参数类型,函数需要在运行时处理时任意参数对象,这种需要对结构体对象反射。例如ORM。
from大佬:https://yq.aliyun.com/articles/599584
关键字:
1)package 进行包命名
2)import 引入包
3)var 用于声明变量
4)interface:两个功能,第一个功能被用于无类型变量,能够接收不同类型的变量,第二个功能是用于定于接口
5)struct 用于定义结构体(类)
6)const 定义常量
7)map 映射
内置函数:
iota 类似枚举,开始的时候为0,然后递增,如果遇到const的话,则重新开始
将自己的知识分享出来之后,有得有失,失去的是自己的优势没了,但是从长远的眼光看的话,这种优势反而不利于自己的成长。得到的是,心理就被迫要学习新的知识,被迫的去深入理解更加复杂的知识,让自己不断突破了自我。
当我总结完,发现我当时面试的时候说的都是些什么啊。。。
加油:现在离精通和深入理解又更进了一步