經(jīng)過(guò)參加一些面試之后饱狂,個(gè)人的一些理解曹步。其實(shí)這些知識(shí)點(diǎn)都懂,但是很少有機(jī)會(huì)描述休讳,所以面試的時(shí)候一問(wèn)就描述不清楚了讲婚,所以寫(xiě)一篇博客組織下自己的語(yǔ)言,能夠清楚表述俊柔。也是慚愧筹麸,這些很基礎(chǔ)的東西,我竟然沒(méi)有經(jīng)常復(fù)習(xí)雏婶。
---更新 2019年07月04日
GO關(guān)鍵字有哪些物赶?(至少應(yīng)該是要倒背如流吧)
GO內(nèi)置函數(shù)有哪些?(至少應(yīng)該是要倒背入流吧)
能清楚的描述每個(gè)關(guān)鍵字和內(nèi)置函數(shù)的作用以及一些場(chǎng)景留晚?
defer酵紫?
new和make的區(qū)別?
panic和error的區(qū)別错维?
無(wú)緩沖和有緩沖的區(qū)別奖地?
unsafe.Pointer和uintptr的區(qū)別?
GO應(yīng)用反射場(chǎng)景赋焕?
CGO編程参歹?
GO關(guān)鍵字?
GO的關(guān)鍵字一共25個(gè)隆判,但是就25個(gè)就足夠完成現(xiàn)在編程的一切所需犬庇,當(dāng)你分析每個(gè)關(guān)鍵字結(jié)合當(dāng)下的編程所需的時(shí)候僧界,就會(huì)發(fā)現(xiàn)GO的設(shè)計(jì)就是一件藝術(shù)品,不多不少臭挽。
包管理:package捎泻、import
變量:var、interface埋哟、struct笆豁、map、type
常量:const
函數(shù):func赤赊、return闯狱、defer
循環(huán):for、continue抛计、break哄孤、range、if吹截、else瘦陈、switch、case波俄、default晨逝、fallthrough、goto
并發(fā):go懦铺、chan捉貌、select
對(duì)于包管理的話(huà),有package冬念、import趁窃,對(duì)于變量的話(huà)有var、interface急前、struct醒陆、map,類(lèi)型定義有type裆针。常量的話(huà)有const刨摩。函數(shù)的話(huà)有func、return据块、defer码邻。循環(huán)的話(huà)折剃,go中的for具有c語(yǔ)言中for+break的所有功能另假,用一個(gè)for完成循環(huán),更加簡(jiǎn)潔怕犁,if边篮、else己莺、switch、case戈轿、default凌受、fallthrough來(lái)完成選擇。
GO內(nèi)置函數(shù)思杯?
new胜蛉、make、append色乾、copy誊册、delete、close暖璧、len案怯、cap、panic澎办、recover
可以將內(nèi)置函數(shù)進(jìn)行分類(lèi)嘲碱,可以得出以下幾個(gè)分類(lèi):
1)新建:new、make
2)添加:append
3)復(fù)制:copy
4)刪除:delete
5)關(guān)閉:close
6)計(jì)算長(zhǎng)度:len局蚀、cap
7)異常處理:panic麦锯、recover
從上面三個(gè)分類(lèi)中,出現(xiàn)了有2個(gè)內(nèi)置函數(shù)琅绅,說(shuō)明要區(qū)分這兩個(gè)函數(shù)的不同离咐。
(1)new和make的區(qū)別?
第一個(gè)區(qū)別:針對(duì)對(duì)象不同奉件,new的傳入是可以任意類(lèi)型的宵蛀,make的傳入類(lèi)型只能是slice、map县貌、chan
第二個(gè)區(qū)別:返回對(duì)象不同术陶,new返回的是一個(gè)指針,make返回的是引用
第三個(gè)區(qū)別:操作不同煤痕,對(duì)于slice梧宫、map、chan來(lái)說(shuō)摆碉,new只為對(duì)象分配內(nèi)存塘匣,make是為對(duì)象分配內(nèi)存和初始化操作
(2)len和cap的區(qū)別?
第一個(gè)區(qū)別:傳入對(duì)象不同巷帝,len可以是string忌卤、slice、map楞泼、chan驰徊,但是cap只能是slice
第二個(gè)區(qū)別:功能不同笤闯,len是計(jì)算已用長(zhǎng)度,cap是計(jì)算對(duì)象分配的容量
(3)panic和error的場(chǎng)景棍厂?
panic是用來(lái)處理異常情況颗味,error是用來(lái)處理錯(cuò)誤情況,什么是異常牺弹?什么是錯(cuò)誤浦马?異常就是你知道會(huì)出現(xiàn)錯(cuò)誤,但是你不知道是什么錯(cuò)张漂。錯(cuò)誤就是你知道會(huì)發(fā)生什么錯(cuò)捐韩,這是這兩者之間的區(qū)別。
無(wú)緩沖和有緩沖的區(qū)別鹃锈?
無(wú)緩沖的話(huà)荤胁,向這個(gè)channel寫(xiě)入之后,如果再向這個(gè)寫(xiě)滿(mǎn)的channel寫(xiě)入數(shù)據(jù)的話(huà)屎债,會(huì)被一直阻塞仅政,直到有一個(gè)協(xié)程去讀取channel。
有緩沖的話(huà)盆驹,只有向channel寫(xiě)滿(mǎn)的情況下寫(xiě)入才會(huì)造成阻塞的情況
無(wú)緩沖:
c := make(chan int, 0)等價(jià)
c := make(chan int)
有緩沖:
c := make(chan int, n) // n > 0
說(shuō)明:無(wú)緩沖make(chan int)和有緩沖make(chan int, 1)的區(qū)別
向make(chan int)放入一個(gè)值的時(shí)候圆丹,就會(huì)被阻塞,直到其他地方有從這個(gè)無(wú)緩沖中讀取內(nèi)容為止躯喇。而向make(chan int, 1)里面放入一個(gè)值的時(shí)候辫封,不會(huì)立即阻塞,直到后面這邊滿(mǎn)為止廉丽,再向里面放一個(gè)值時(shí)才會(huì)阻塞倦微。
defer功能和使用場(chǎng)合?
defer用于退出執(zhí)行正压,比如打開(kāi)文件之后欣福,需要關(guān)閉,以及打開(kāi)數(shù)據(jù)庫(kù)之類(lèi)的操作焦履,主要是應(yīng)對(duì)在操作過(guò)程中遇到某些情況拓劝,如需要返回錯(cuò)誤或發(fā)生panic的時(shí)候,關(guān)閉操作依然能被執(zhí)行嘉裤,關(guān)于defer的效率問(wèn)題郑临,可以看我的另一篇博客:,defer對(duì)程序的效率影響可以忽略不計(jì)屑宠。
unsafe.Pointer和uintptr的區(qū)別厢洞?
go指針詳情可以參考我的博客文章:http://www.reibang.com/writer#/notebooks/28359403/notes/33744906
區(qū)別一:功能不同,unsafe.Pointer不能進(jìn)行指針運(yùn)算,用于充當(dāng)普通指針和uintptr的轉(zhuǎn)換橋梁犀变,uintptr可以進(jìn)行指針運(yùn)算
區(qū)別二:實(shí)質(zhì)不同,GC將unsafe.Pointer看成一個(gè)指針引用总珠,uintptr不被GC當(dāng)成指針睦授,也就是當(dāng)一個(gè)地址被uintptr指向外志电,沒(méi)有被其他所指向,則會(huì)被GC回收省店。
GO應(yīng)用反射場(chǎng)景?
有兩種情況:
1)不知道接口調(diào)用哪個(gè)函數(shù)笨触,根據(jù)傳入?yún)?shù)在運(yùn)行時(shí)確定調(diào)用的具體接口懦傍,這種需要對(duì)函數(shù)或方法反射。例如:橋接模式芦劣。
2)不知道傳入函數(shù)的參數(shù)類(lèi)型粗俱,函數(shù)需要在運(yùn)行時(shí)處理時(shí)任意參數(shù)對(duì)象,這種需要對(duì)結(jié)構(gòu)體對(duì)象反射虚吟。例如ORM寸认。
from大佬:https://yq.aliyun.com/articles/599584
關(guān)鍵字:
1)package 進(jìn)行包命名
2)import 引入包
3)var 用于聲明變量
4)interface:兩個(gè)功能,第一個(gè)功能被用于無(wú)類(lèi)型變量串慰,能夠接收不同類(lèi)型的變量偏塞,第二個(gè)功能是用于定于接口
5)struct 用于定義結(jié)構(gòu)體(類(lèi))
6)const 定義常量
7)map 映射
內(nèi)置函數(shù):
iota 類(lèi)似枚舉,開(kāi)始的時(shí)候?yàn)?邦鲫,然后遞增灸叼,如果遇到const的話(huà),則重新開(kāi)始
將自己的知識(shí)分享出來(lái)之后庆捺,有得有失古今,失去的是自己的優(yōu)勢(shì)沒(méi)了,但是從長(zhǎng)遠(yuǎn)的眼光看的話(huà)滔以,這種優(yōu)勢(shì)反而不利于自己的成長(zhǎng)沧卢。得到的是,心理就被迫要學(xué)習(xí)新的知識(shí)醉者,被迫的去深入理解更加復(fù)雜的知識(shí)但狭,讓自己不斷突破了自我。
當(dāng)我總結(jié)完撬即,發(fā)現(xiàn)我當(dāng)時(shí)面試的時(shí)候說(shuō)的都是些什么啊立磁。。剥槐。
加油:現(xiàn)在離精通和深入理解又更進(jìn)了一步