星媛面試-進(jìn)大廠必備--Go語言十問(已上岸,貢獻(xiàn)給學(xué)弟學(xué)妹)

一,golang語言的數(shù)組與切片的區(qū)別

答:數(shù)組是一個固定長度的基本數(shù)據(jù)結(jié)構(gòu)類型,slice是基于數(shù)組實(shí)現(xiàn)的一種長度可變的數(shù)據(jù)結(jié)構(gòu)常用類型

具體區(qū)別如下:

1,創(chuàng)建方式不同,數(shù)組如abc := [...]int{1, 2, 3, 4},slice如abc:=[]int{1, 2, 3,4} 或者 abc:=make([]int, 4, 10)

2,傳遞方式不同,數(shù)組是值傳遞,slice是引用傳遞

3,底層結(jié)構(gòu)不同,數(shù)組基本數(shù)據(jù)類型,slice header的底層結(jié)構(gòu)如下

type SliceHeader struct {

? ? Data uintptr

? ? Len? int

? ? Cap? int

}

其中SliceHeader是slice的運(yùn)行時表示形式

參考:https://golang.org/ref/spec#Array_types

https://blog.golang.org/slices-intro

https://golang.org/pkg/reflect/#SliceHeader

二,golang的map類型與C++的map類型區(qū)別

1, golang的map類型,僅僅是一個哈希表,具體結(jié)構(gòu)如下:

// A header for a Go map.

type hmap struct {

// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.

// Make sure this stays in sync with the compiler's definition.

count? ? int // # live cells == size of map.? Must be first (used by len() builtin)

flags? ? uint8

B? ? ? ? uint8? // log_2 of # of buckets (can hold up to loadFactor * 2^B items)

noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details

hash0? ? uint32 // hash seed

buckets? ? unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.

oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing

nevacuate? uintptr? ? ? ? // progress counter for evacuation (buckets less than this have been evacuated)

extra *mapextra // optional fields

}

參考:https://golang.org/src/runtime/map.go

其中特性如下:

申請必須make,或者使用:=方式,直接使用未初始化的map會panic;

引用類型;

key的類型必須是可比較類型;

并發(fā)使用不安全,需要加sync.RWMutex鎖;

不指定迭代順序,若需要順序,則需要另外申請slice保存keys,然后sort.Ints(keys);

參考:https://blog.golang.org/maps

2,C++的map的底層結(jié)構(gòu)是紅黑樹

三,close通道關(guān)閉之后,Println輸出之后的值,是否可以寫入

1,close通道關(guān)閉之后,執(zhí)行fmt.Println(<- ch),若ch還有值,則輸出ch的值,否則輸出ch類型的默認(rèn)值

2,若寫入close的通道,則會panic,報錯:panic: send on closed channel

四,簡述chan類型

1,貫穿go語言的設(shè)計(jì)思想:不要通過共享內(nèi)存來通信,而應(yīng)該通過通信來共享內(nèi)存。

2,類似一個先進(jìn)先出隊(duì)列;其中buf是一個循環(huán)鏈表結(jié)構(gòu);lock是互斥鎖,所以線程安全;

3,分為無緩沖通道和有緩存通道,無緩沖通道必須先有消費(fèi)協(xié)程,然后再可發(fā)送數(shù)據(jù);

4,關(guān)閉chan,使用close,關(guān)閉之后不可再寫入,但可以消費(fèi)chan中的數(shù)據(jù)。

五,defer/panic/recover/return的理解

1,defer延遲執(zhí)行

2.1 在函數(shù)return之前可以執(zhí)行的一段代碼,常用于資源釋放,解鎖,增加recover等操作。

2.2 多個defer執(zhí)行順序LIFO

例子:

package main

import (

"fmt"

"errors"

)

func main() {

? fmt.Printf("with named param, x: %d\n", namedParam())

? fmt.Printf("error from err1: %v\n", err1())

}

func namedParam() (x int) {

? x = 1

? defer func() { x = 2 }()

? return x

}

func err1() error {

? var err error

? defer func() {

? ? ? if r := recover(); r != nil {

? ? ? ? err = errors.New("recovered")

? ? ? }

? }()

? panic(`foo`)

? return err

}

輸出:

with named param, x: 2

error from err1: <nil>

2,panic恐慌

2.1 內(nèi)置函數(shù),出現(xiàn)致命錯誤可以使用panic退出程序,如:panic("has error")

3,recover恢復(fù)

3.1 內(nèi)置函數(shù),重新獲得panicking協(xié)程的控制,防止程序崩潰。注意像fatal的錯誤無法捕獲,如map的并發(fā)讀寫:fatal error: concurrent map read and map write;死鎖:fatal error: all goroutines are asleep - deadlock(申請無緩沖chan,直接生產(chǎn)數(shù)據(jù)會報此致命錯誤)

舉例如下:

package main

import (

"fmt"

)

func main() {

defer fmt.Println("recover first ", recover())

defer func() {

if r := recover(); r != nil {

fmt.Println("recover ", r)

}

}()

defer fmt.Println("recover second ", recover())

panic("has error")

}

輸出:

recover second <nil>

recover? has error

recover first? <nil>

4,return函數(shù)返回

4.1 return操作不是原子操作,過程具體可以分為三步:

首先賦值,把return的值賦給返回值

其次檢查defer操作,有則調(diào)用,所以defer里面的函數(shù)是可以更改返回值的

最后返回返回值

六,簡述內(nèi)存逃逸,遇沒有遇見過內(nèi)存溢出及內(nèi)存泄漏

1,內(nèi)存逃逸

1.1 golang的內(nèi)存分配逃逸于棧和堆

1.2 查看逃逸分析日志命令:go build -gcflags=-m

1.3 逃逸場景:指針逃逸,返回局部變量指針;大對象逃逸,申請局部變量是大對象的時候;動態(tài)類型,申請不確定大小內(nèi)存的局部變量逃逸;閉包引用對象逃逸;

1.4 分析內(nèi)存逃逸好處:可減少gc的壓力,不逃逸則函數(shù)結(jié)束可以回收清理,不需要gc標(biāo)識清理過程(所以指針傳遞不一定比值傳遞效率高);棧上分配內(nèi)存效率更高(不是絕對,棧也會擴(kuò)容縮容);靜態(tài)分析,編譯時完成(不影響性能);

1.5 舉個例子如下:

package main

import "fmt"

func fibo() func() int {

a, b := 0, 1

fmt.Println("first a, b", a, b)

return func() int {

a, b = b, a+b

return a

}

}

func main() {

f := fibo()

for i := 0; i < 6; i++ {

fmt.Printf("fib: %d\n", f())

}

f1 := fibo()

fmt.Printf("fib1: %d\n", f1())

fmt.Println("f:%p", &f, ", f1:%p", &f1)

}

運(yùn)行輸出:

first a, b 0 1

fib: 1

fib: 1

fib: 2

fib: 3

fib: 5

fib: 8

first a, b 0 1

fib1: 1

f:%p 0xc00000e028 , f1:%p 0xc00000e038

另外可以分析逃逸情況,輸入命令:go build -gcflags=-m

輸出如下:

# test/t_memory_escape

./main.go:9:13: inlining call to fmt.Println

./main.go:11:9: can inline fibo.func1

./main.go:27:13: inlining call to fmt.Printf

./main.go:33:12: inlining call to fmt.Printf

./main.go:35:13: inlining call to fmt.Println

./main.go:7:2: moved to heap: a

./main.go:7:5: moved to heap: b

./main.go:9:14: "first a, b" escapes to heap

./main.go:9:14: a escapes to heap

./main.go:9:14: b escapes to heap

可以看見a/b倆變量都逃逸了

2,內(nèi)存溢出

2.1 golang的內(nèi)存溢出基本沒有見過,因?yàn)樗亩褩P畔⑹强梢詳U(kuò)容的,初始棧的容量是2k。

3,內(nèi)存泄漏

3.1 golang的內(nèi)存管理是使用gc機(jī)制自動化管理,使用方法是標(biāo)記清理法,具體到三色標(biāo)記法,另外使用屏障等技術(shù)提高回收效率。

3.2 golang是存在內(nèi)存泄漏的,如文件/套接字等句柄沒有關(guān)閉釋放。這個沒有釋放的句柄會堆積在內(nèi)存,gc并不會回收他們,導(dǎo)致內(nèi)存泄漏。也有可能是啟動的goroutine沒有按預(yù)期退出,導(dǎo)致協(xié)程泄漏。

七,有沒有使用過pprof/Benchmark工具

1,pprof工具

1.1 pprof工具是golang自帶的性能分析神器

1.2 查看堆棧信息:go tool pprof http://localhost:6060/debug/pprof/heap

1.3 查看cpu信息:go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

1.4 查看goroutine信息:go tool pprof http://localhost:6060/debug/pprof/goroutine

1.5 查看trace路徑信息:go tool pprof http://localhost:6060/debug/pprof/trace

2,Benchmark工具

1.1 性能測試工具

1.2 基準(zhǔn)測試,需要_test.go結(jié)尾

八,簡述golang語言的GMP機(jī)制

1,G是goroutine的縮寫,用來表示協(xié)程;M是machine的縮寫,用來表示線程,可以設(shè)置最大數(shù)量:SetMaxThreads;P是processor的縮寫,用來表示邏輯處理器,p的個數(shù)配置GOMAXPROCS;

2,p隊(duì)列有兩種,一種全局隊(duì)列,平衡多個p隊(duì)列之間的任務(wù),有鎖;一種本地隊(duì)列,無數(shù)據(jù)競爭,速度快,無鎖;

3,啟動方式,首先確定p的個數(shù),若有設(shè)置環(huán)境變量$GOMAXPROCS或者是runtime.GOMAXPROCS()則按設(shè)置數(shù)量,否則使用默認(rèn)值cpu核心數(shù)。其次動態(tài)調(diào)整m的數(shù)量,若沒有足夠的數(shù)量的m關(guān)聯(lián)p中可運(yùn)行的g的時候會新創(chuàng)m,如所有的m被阻塞時。

4,調(diào)度設(shè)計(jì)策略,首先當(dāng)m無g可運(yùn)行時,會優(yōu)先從其他p本地隊(duì)列盜取g來運(yùn)行,本地隊(duì)列沒有,才會盜取全局隊(duì)列;其次當(dāng)本地m運(yùn)行的g,因進(jìn)行系統(tǒng)調(diào)用而阻塞時,m會釋放綁定的p,p會轉(zhuǎn)移到其他空閑的m上運(yùn)行其他的g;最后go1.14及之后,屬于基于信號的搶占式調(diào)度,一個g不能無限占用cpu時間,占用一定時間是可以被搶占的,防止其他g餓死;

參考:https://learnku.com/articles/41728


九,簡述golang語言的gc機(jī)制

1,golang的gc(garbage collection)機(jī)制,使用方法是標(biāo)記清理法,具體到三色標(biāo)記法,另外使用屏障等技術(shù)提高回收效率。

十,簡述golang語言cgo原理

1,cgo主要是用來創(chuàng)建go語言包調(diào)用c代碼,詳細(xì)可見:https://golang.org/pkg/cmd/cgo/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 目錄 統(tǒng)一規(guī)范篇 命名篇 開發(fā)篇 優(yōu)化篇 統(tǒng)一規(guī)范篇 本篇主要描述了公司內(nèi)部同事都必須遵守的一些開發(fā)規(guī)矩,如統(tǒng)一開...
    零一間閱讀 1,951評論 0 2
  • 選擇題 [primary] 下面屬于關(guān)鍵字的是() A. func B. def C. struct D. cla...
    盤木閱讀 1,848評論 0 29
  • 能力模式 選擇題 【初級】下面屬于關(guān)鍵字的是()A. funcB. defC. structD. class 參考...
    靈魂深靈閱讀 5,302評論 2 5
  • 統(tǒng)一規(guī)范篇 合理規(guī)劃目錄 本篇主要描述了公司內(nèi)部同事都必須遵守的一些開發(fā)規(guī)矩,如統(tǒng)一開發(fā)空間,既使用統(tǒng)一的開發(fā)工具...
    我就是小政政閱讀 1,828評論 1 2
  • https://draveness.me/golang/[https://draveness.me/golang/...
    shuff1e閱讀 538評論 0 0