怎样才算熟悉GO?

经过参加一些面试之后,个人的一些理解。其实这些知识点都懂,但是很少有机会描述,所以面试的时候一问就描述不清楚了,所以写一篇博客组织下自己的语言,能够清楚表述。也是惭愧,这些很基础的东西,我竟然没有经常复习。

---更新 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的话,则重新开始

将自己的知识分享出来之后,有得有失,失去的是自己的优势没了,但是从长远的眼光看的话,这种优势反而不利于自己的成长。得到的是,心理就被迫要学习新的知识,被迫的去深入理解更加复杂的知识,让自己不断突破了自我。

当我总结完,发现我当时面试的时候说的都是些什么啊。。。
加油:现在离精通和深入理解又更进了一步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 11,465评论 1 5
  • 1.安装 https://studygolang.com/dl 2.使用vscode编辑器安装go插件 3.go语...
    go含羞草阅读 5,530评论 0 6
  • Go入门 Go介绍 部落图鉴之Go:爹好还这么努力? 环境配置 安装 下载源码编译安装 下载相应平台的安装包安装 ...
    齐天大圣李圣杰阅读 10,108评论 0 26
  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,651评论 1 46
  • 你要做一个披荆斩棘无所不能的女英雄, 直到遇见能托付一生的人, 再做一个瓶盖都拧不开的小公主。 一个姑娘最酷的时候...
    姓善名恶阅读 3,269评论 5 5

友情链接更多精彩内容