- 與其他語言相比制圈,使用 Go 有什么好處?
??查看答案??
· 與其他作為學術實驗開始的語言不同权谁, Go 代碼的設計是務實的。每個功能 和語法決策都旨在讓程序員的生活更輕松憋沿。
· Golang 針對并發(fā)進行了優(yōu)化旺芽,并且在規(guī)模上運行良好。 · 由于單一的標準代碼格式辐啄, Golang 通常被認為比其他語言更具可讀性采章。
· 自動垃圾收集明顯比 Java 或 Python 更有效,因為它與程序同時執(zhí)行壶辜。
- Go 程序中的包是什么悯舟?
??查看答案??
包 (pkg) 是 Go 工作區(qū)中包含 Go 源文件或其他包的目錄。源文件中的每個函 數(shù)士复、變量和類型都存儲在鏈接包中图谷。每個 Go 源文件都屬于一個包。
- 什么是 Goroutine阱洪? 你如何停止它便贵?
??查看答案??
一個 Goroutine 是一個函數(shù)或方法執(zhí)行同時旁邊其他任何夠程采用了特殊的 Goroutine 線程。 Goroutine 線程比標準線程更輕量級冗荸,大多數(shù) Golang 程序 同時使用數(shù)千個 Goroutine承璃。 要創(chuàng)建 Goroutine,請 go 在函數(shù)聲明之前添加關鍵字蚌本。 您可以通過向 Goroutine 發(fā)送一個信號通道來停止它盔粹。 Goroutines 只能在被 告知檢查時響應信號隘梨,因此您需要在邏輯位置(例如 for 循環(huán)頂部)包含檢查。
- Go 兩個接口之間可以存在什么關系舷嗡?
??查看答案??
如果兩個接口有相同的方法列表轴猎,那么他們就是等價的,可以相互賦值进萄。如果 接口 A 的方法列表是接口 B 的方法列表的子集捻脖,那么接口 B 可以賦值給接口 A。接口查詢是否成功中鼠,要在運行期才能夠確定可婶。
- Go 語言當中 Channel 緩沖有什么特點?
??查看答案??
無緩沖的 channel 是同步的援雇,而有緩沖的 channel 是非同步的矛渴。
- Go Convey 是什么? 一般用來做什么惫搏?
??查看答案??
· go convey 是一個支持 Golang 的單元測試框架
· go convey 能夠自動監(jiān)控文件修改并啟動測試具温,并可以將測試結果實時輸出 到 Web 界面
· go convey 提供了豐富的斷言簡化測試用例的編寫
- Go 語言當中 new 的作用是什么?
??查看答案??
new 創(chuàng)建一個該類型的實例晶府,并且返回指向該實例的指針桂躏。 new 函數(shù)是內建函數(shù),函數(shù)定義:
· 使用 new 函數(shù)來分配空間
· 傳遞給 new 函數(shù)的是一個類型川陆,而不是一個值
· 返回值是指向這個新分配的地址的指針
- Go 語言是如何實現(xiàn)切片擴容的剂习?
??查看答案??
func main() {
arr := make([]int, 0)
{ fmt.Println("len 為", len(arr), "cap 為", cap(arr)) arr = append(arr, i) }
}
- Golang Slice 的擴容機制,有什么注意點较沪?
??查看答案??
Go 中切片擴容的策略是這樣的:
· 首先判斷鳞绕,如果新申請容量大于 2 倍的舊容量,最終容量就是新申請的容 量 · 否則判斷尸曼,如果舊切片的長度小于 1024们何,則最終容量就是舊容量的兩倍 · 否則判斷,如果舊切片長度大于等于 1024控轿,則最終容量從舊容量開始循環(huán) 增加原來的 1/4, 直到最終容量大于等于新申請的容量 · 如果最終容量計算值溢出冤竹,則最終容量就是新申請容量
· 否則判斷,如果舊切片的長度小于 1024茬射,則最終容量就是舊容量的兩倍
· 否則判斷鹦蠕,如果舊切片長度大于等于 1024,則最終容量從舊容量開始循環(huán) 增加原來的 1/4, 直到最終容量大于等于新申請的容量
· 如果最終容量計算值溢出在抛,則最終容量就是新申請容量
- Golang Map 底層實現(xiàn)
??查看答案??
Golang 中 map 的底層實現(xiàn)是一個散列表钟病,因此實現(xiàn)map 的過程實際上就是實現(xiàn) 散表的過程。在這個散列表中,主要出現(xiàn)的結構體有兩個肠阱,一個叫 hmap(a header for a go map)票唆,一個叫 bmap(a bucket for a Go map,通常叫其 bucket)屹徘。
- 介紹一下 Channel
??查看答案??
Go 語言中走趋,不要通過共享內存來通信,而要通過通信來實現(xiàn)內存共享噪伊。 Go 的 CSP(Communicating Sequential Process)并發(fā)模型吆视,中文可以叫做通信順序進 程,是通過 goroutine 和 channel 來實現(xiàn)的酥宴。 channel 收發(fā)遵循先進先出 FIFO 的原則。分為有緩沖區(qū)和無緩沖區(qū)您觉,channel 中包括 buffer拙寡、sendx 和 recvx 收發(fā)的位置(ring buffer 記錄實現(xiàn))、sendq琳水、 recv肆糕。當 channel 因為緩沖區(qū)不足而阻塞了隊列,則使用雙向鏈表存儲在孝。
作者:力扣 (LeetCode)
鏈接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/niap8s/
來源:力扣(LeetCode)
著作權歸作者所有诚啃。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處私沮。
- Mutex 允許自旋的條件始赎?
??查看答案??
· 鎖已被占用,并且鎖不處于饑餓模式仔燕。
· 積累的自旋次數(shù)小于最大自旋次數(shù)
(active_spin=4)造垛。
· CPU 核數(shù)大于 1。
· 有空閑的 P晰搀。
· 當前 Goroutine 所掛載的 P 下五辽,本地待運行隊列為空。
- Cond 是什么外恕?
??查看答案??
Cond 實現(xiàn)了一種條件變量杆逗,可以使用在多個 Reader 等待共享資源ready 的場 景(如果只有一讀一寫,一個鎖或者 channel 就搞定了) 每個 Cond 都會關聯(lián)一個 Lock(*sync.Mutex or *sync.RWMutex)鳞疲,當修改條 件或者調用 Wait 方法時罪郊,必須加鎖,保護 condition建丧。
- Broadcast 和 Signal 區(qū)別排龄?
??查看答案??
由于 Wait()第一次恢復時, C.L 并沒有加鎖,所以當 Wait 返回時橄维,調用者通常 并不能假設條件為真尺铣。如下代碼: 。 取而代之的是, 調用者應該在循環(huán)中調用 Wait争舞。(簡單來說凛忿,只要想使用 condition,就必須加鎖竞川。)
· Once 可以用來執(zhí)行且僅僅執(zhí)行一次動作店溢,常常用于單例對象的初始化場 景。
· Once 常常用來初始化單例資源委乌,或者并發(fā)訪問只需初始化一次的共享資 源床牧,或者在測試的時候初始化一次測試資源。
· sync.Once 只暴露了一個方法 Do遭贸,你可以多次調用 Do 方法戈咳,但是只有第 一次調用 Do 方法時 f 參數(shù)才會執(zhí)行,這里的 f 是一個無參數(shù)無返回值 的函數(shù)壕吹。 假設包含 3 個參數(shù)內存位置(V)著蛙、預期原值(A)和新值(B)。V 表示要更新變量的 值耳贬, E 表示預期值踏堡, N 表示新值。僅當 V 值等于 E 值時咒劲,才會將 V 的值設為 N顷蟆, 如果 V 值和 E 值不同,則說明已經有其他線程在做更新缎患,則當前線程什么都不 做慕的,最后 CAS 返回當前 V 的真實值。 CAS 操作時抱著樂觀的態(tài)度進行的挤渔,它總 是認為自己可以成功完成操作肮街。基于這樣的原理判导, CAS 操作即使沒有鎖嫉父,也可 以發(fā)現(xiàn)其他線程對于當前線程的干擾。 賴于 CPU 的核心數(shù)量眼刃,而是交給 Golang 的運行時統(tǒng)一調度绕辖。
- GMP 調度流程?
??查看答案??
off擂红,并尋找新的 idle 的 M仪际,若沒有 idle 的 M 就會新建一個 M(流程 5.1) · 當 G 因 channel 或者 network I/O 阻塞時,不會阻塞 M,M 會尋找其他 runnable 的 G树碱;當阻塞的 G 恢復后會重新進入 runnable 進入 P 隊列等待執(zhí) 行(流程 5.3)
- 協(xié)作式的搶占式調度
??查看答案??
在 1.14 版本之前肯适,程序只能依靠 Goroutine 主動讓出 CPU 資源才能觸發(fā)調 度。這種方式存在問題有: · 某些 Goroutine 可以長時間占用線程成榜,造成其它 Goroutine 的饑餓 · 垃圾回收需要暫停整個程序(Stop-the-world框舔,STW),最長可能需要幾分 鐘的時間赎婚,導致整個程序無法工作刘绣。
- Sysmon 有什么作用?
??查看答案??
Sysmon 也叫監(jiān)控線程挣输,變動的周期性檢查纬凤,好處 · 釋放閑置超過 5 分鐘的 span 物理內存; · 如果超過 2 分鐘沒有垃圾回收撩嚼,強制執(zhí)行移斩; · 將長時間未處理的 netpoll 添加到全局隊列; · 向長時間運行的 G 任務發(fā)出搶占調度(超過 10ms 的 g绢馍,會進行 retake); · 收回因 syscall 長時間阻塞的 P
- GC 觸發(fā)時機
??查看答案??
主動觸發(fā):調用 runtime.GC 被動觸發(fā): 使用系統(tǒng)監(jiān)控肠套,該觸發(fā)條件由 runtime.forcegcperiod 變量控制舰涌,默認為 2 分 鐘。當超過兩分鐘沒有產生任何 GC 時你稚,強制觸發(fā) GC瓷耙。 使用步調(Pacing)算法,其核心思想是控制內存增長的比例刁赖。如 Go 的 GC 是一種比例 GC, 下一次 GC 結束時的堆大小和上一次 GC 存活堆大小成比例.
- 什么是 REST / RESTful 以及它的用途是什么搁痛?
??查看答案??
Representational State Transfer(REST)/ RESTful Web 服務是一種幫助計 算機系統(tǒng)通過 Internet 進行通信的架構風格。這使得微服務更容易理解和實 現(xiàn)宇弛。 微服務可以使用或不使用 RESTful API 實現(xiàn)鸡典,但使用 RESTful API 構建松散 耦合的微服務總是更容易。
- Docker 是什么枪芒?
??查看答案??
Docker 是一個容器化平臺彻况,它包裝你所有開發(fā)環(huán)境依賴成一個整體,像一個容 器舅踪。保證項目開發(fā)纽甘,如開發(fā)、測試抽碌、發(fā)布等各生產環(huán)節(jié)都可以無縫工作在不同 的平臺
Docker 容器:將一個軟件包裝在一個完整的文件系統(tǒng)中悍赢,該文件系統(tǒng)包含運行所需的一切:代碼,運行時,系統(tǒng)工具左权,系統(tǒng)庫等皮胡。可以安裝在服務器上的任 何東西涮总。 這保證軟件總是運行在相同的運行環(huán)境胸囱,無需考慮基礎環(huán)境配置的改變。
- DevOps 有哪些優(yōu)勢瀑梗?
??查看答案??
技術優(yōu)勢: 持續(xù)的軟件交付能力 修復問題變得簡單 更快得解決問題 商業(yè)優(yōu)勢: 更快交付的特性 更穩(wěn)定的操作系統(tǒng)環(huán)境 更多時間可用于創(chuàng)造價值 (而不是修復 / 維護)
- CI 服務有什么用途烹笔?
??查看答案??
CI (Continuous Integration)-- 持續(xù)集成服務 -- 主要用于整合團隊開發(fā) 中不同開發(fā)者提交到開發(fā)倉庫中的項目代碼變化,并即時整合編譯抛丽,檢查整合 編譯錯誤的服務谤职。它需要一天中多次整合編譯代碼的能力,若出現(xiàn)整合錯誤亿鲜, 可以優(yōu)異地準確定位提交錯誤源允蜈。
作者:力扣 (LeetCode)
鏈接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/ni2etd/
來源:力扣(LeetCode)
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權蒿柳,非商業(yè)轉載請注明出處饶套。
- Docker 群(Swarm)是什么?
??查看答案??
Docker Swarm -- Docker 群 -- 是原生的 Docker 集群服務工具垒探。它將一群 Docker 主機集成為單一一個虛擬 Docker 主機妓蛮。利用一個 Docker 守護進程, 通過標準的 Docker API 和任何完善的通訊工具圾叼, Docker Swarm 提供透明地將 Docker 主機擴散到多臺主機上的服務蛤克。
- 請解釋一下 docerfile 配置文件中的 ONBUILD 指令的用途和含義
??查看答案??
配置文件中的 ONBUILD 指令為創(chuàng)建的 Docker image (映像)加入在將來執(zhí)行 的指令(譯注:在當前配置文件生成的映像中并不執(zhí)行), 用于在以這個創(chuàng)建 的映像為基礎的創(chuàng)建的子映像(image) 中執(zhí)行或定制夷蚊。 舉例构挤, 以基映像創(chuàng) 建自己的映像時,可定制創(chuàng)建特有的用戶化的配置環(huán)境惕鼓。 ( 譯注: 由于原文較短筋现,關于這個問題容易迷惑。 譯者認為箱歧,總體來說關鍵 理解 -- 以基礎映像創(chuàng)建自有的映像過程中夫否,基礎映像中所有的創(chuàng)建層或指令
譯注: 1 圖中文字: 數(shù)據(jù)保存在容器中,當容器停止運行時叫胁,運行狀態(tài)數(shù)據(jù)丟失凰慈! 2 圖中文字: 數(shù)據(jù)保存在主機卷(Host Volume)中,當主機停機時驼鹅,運行狀 態(tài)數(shù)據(jù)將無法訪問 3 圖中文字: 數(shù)據(jù)保存在網絡文件系統(tǒng)卷中微谓,數(shù)據(jù)訪問不依賴容器的運行與主 機的運行 若您使用: docker run -v hostFolder:/containerfolder 命令運行您的容 器森篷, 容器運行中任何對 /containerfolder 目錄下數(shù)據(jù)的改變, 將永久保存 在主機的 hostfolder 目錄下豺型。 使用網絡文件系統(tǒng)(nfs)與此類似仲智。 那樣您 就可以運行您的容器在任何主機上且其運行狀態(tài)數(shù)據(jù)被保存在網絡文件系統(tǒng) 上。
- 容器化技術在底層的運行原理姻氨?
??查看答案??
2006 年前后钓辆, 人們,包括一些谷歌的雇員肴焊, 在 Linux 內核級別上實現(xiàn)了一 種新的名為 命名空間(namespace) 的技術(實際上這種概念在 FreeBSD 系 統(tǒng)上由來已久)前联。我們知道,操作系統(tǒng)的一個功能就是進程共享公共資源娶眷, 諸 如似嗤,網絡和硬盤空間等。 但是届宠,如果一些公共資源被包裝在一個命名空間中烁落, 只允許屬于這個命名空間中的進程訪問又如何呢? 也就是說豌注,可以分配一大塊 硬盤空間給命名空間 X 供其使用伤塌,但是,命名空間 Y 中的進程無法看到或訪 問這部分資源轧铁。 同樣地寸谜, 命名空間 Y 中分配的資源,命名空間 X 中的進程 也無法訪問属桦。當然, X 中的進程無法與 Y 中的進程進行交互他爸。這提供了某種 對公共資源的虛擬化和隔離的技術聂宾。 這就是 Docker 技術的底層工作原理: 每個容器運行在它自己的命名空間中, 但是诊笤,確實與其它運行中的容器共用相同的系統(tǒng)內核系谐。 隔離的產生是由于系統(tǒng) 內核清楚地知道命名空間及其中的進程,且這些進程調用系統(tǒng) API 時讨跟,內核保 證進程只能訪問屬于其命名空間中的資源纪他。
- 說說容器化技術與虛擬化技術的優(yōu)缺點
??查看答案??
僅有下面的一些對比:
不能像虛擬機那樣在容器上運行與主機完全不同的操作系統(tǒng)。 然而晾匠, 可以在 容器上運行不同的 Linux 發(fā)布版茶袒,由于容器共享系統(tǒng)內核的緣故。容器的隔離 性沒有虛擬機那么健壯凉馆。事實上薪寓, 在早期容器化技術實現(xiàn)上亡资,存在某種方法使 客戶容器可接管整個主機系統(tǒng)。 也可看到向叉,載入新容器并運行锥腻,并不會像虛擬機那樣裝載一個新的操作系統(tǒng)進 來。 所有的容器共享同一系統(tǒng)內核母谎, 這也就是容器被認為非常輕量化的原因瘦黑。 同樣的原因,不像虛擬機奇唤, 你不須為容器預分配大量的內存空間幸斥, 因為它不 是運行新的整個的操作系統(tǒng)。 這使得在一個操作系統(tǒng)主機上冻记,可以同時運行成 百上千個容器應用睡毒, 在運行完整操作系統(tǒng)的虛擬機上,進行這么多的并行沙箱 實驗是不可能的冗栗。
- 一個字符串類型的值能存儲最大容量是多少演顾?
??查看答案??
答: 512M
- Jedis 與 Redisson 對比有什么優(yōu)缺點?
??查看答案??
Jedis 是 Redis 的 Java 實現(xiàn)的客戶端隅居,其 API 提供了比較全面的 Redis 命 令的支持钠至; Redisson 實現(xiàn)了分布式和可擴展的 Java 數(shù)據(jù)結構,和 Jedis 相 比胎源,功能較為簡單棉钧,不支持字符串操作,不支持排序涕蚤、事務宪卿、管道、 分區(qū)等 Redis 特性万栅。 Redisson 的宗旨是促進使用者對 Redis 的關注分離佑钾,從而讓使用者能夠將精 力更集中地放在處理業(yè)務邏輯上。
- Redis 集群會有寫操作丟失嗎烦粒? 為什么休溶?
??查看答案??
Redis 并不能保證數(shù)據(jù)的強一致性,這意味這在實際中集群在特定的條件 下可 能會丟失寫操作扰她。
- 怎么理解 Redis 事務兽掰?
??查看答案??
(1)事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執(zhí) 行徒役。事務在執(zhí)行的過程中孽尽,不會被其他客戶端發(fā)送來的命令請求所打斷。
(2)事務是一個原子操作:事務中的命令要么全部被執(zhí)行忧勿,要么全部都不執(zhí) 行泻云。
- char 和 varchar 的區(qū)別艇拍?
??查看答案??
· char 和 varchar 類型在存儲和檢索方面有所不同
· char 列長度固定為創(chuàng)建表時聲明的長度,長度值范圍是 1 到 255
· 當 char 值被存儲時宠纯, 它們被用空格填充到特定長度卸夕,檢索 char 值時需刪 除尾隨空格。
- MyISAM 存儲引擎的特點婆瓜?
??查看答案??
在 5.1 版本之前快集, MyISAM 是 MySQL 的默認存儲引擎, MylSAM 并發(fā)性比較差廉白,使用的場景比較少主要特點是:
· 不支持事務操作个初, ACID 的特性也就不存在了,這一設計是為了性能和效率 考慮的
· 不支持外鍵操作猴蹂,如果強行增加外鍵院溺, MySQL 不會報錯,只不過外鍵不起作 用磅轻。
· MyISAM 默認的鎖粒度是表級鎖珍逸,所以并發(fā)性能比較差,加鎖比較快聋溜,鎖沖 突比較少谆膳,不太容易發(fā)生死鎖的情況。
· MyISAM 會在磁盤上存儲三個文件撮躁,文件名和表名相同漱病,擴展名分別是 frm(存儲表定義)、MYD(MYData把曼,存儲數(shù)據(jù))杨帽、MYI(MyIndex,存儲索引)嗤军。 這里需要特別注意的是 MyISAM 只緩存 索引文件注盈,并不緩存數(shù)據(jù)文件。
· MyISAM 支持的索引類型有全局索引(Full-Text)型雳、B-Tree 索引、 R-Tree 索 引 Full-Text 索引:它的出現(xiàn)是為了解決針對文本的模糊查詢效率較低的 問題山害。 B-Tree 索引:所有的索引節(jié)點都按照平衡樹的數(shù)據(jù)結構來存儲纠俭,所有的 索引數(shù)據(jù)節(jié)點都在葉節(jié)點
R-Tree 索引:它的存儲方式和 B-Tree 索引有一些區(qū)別,主要設計用于 存儲空間和多維數(shù)據(jù)的字段做索引目前的 MySQL 版本僅支持 geometry 類型的字段作索引浪慌,相對于 BTREE,RTREE 的優(yōu)勢在于范圍查找冤荆。
· 數(shù)據(jù)庫所在主機如果宕機, MyISAM 的數(shù)據(jù)文件容易損壞权纤,而且難以恢復钓简。
· 增刪改查性能方面:SELECT 性能較高乌妒,適用于查詢較多的情況
作者:力扣 (LeetCode)
鏈接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/ninxuh/
來源:力扣(LeetCode)
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權外邓,非商業(yè)轉載請注明出處撤蚊。