最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Go語言面試題

2023-04-12 12:00 作者:諸葛孔明瑾  | 我要投稿

1、Go?動垃圾收集明顯? Java 或 Python 更有效,為什么

????????并不是絕對,但是Java和Python的垃圾收集器通常會暫停應用程序的執(zhí)行,以便進行垃圾收集,而go和程序同時執(zhí)行的

2、切片定義的幾種方式

  • 基本定義:list := []int{1, 2, 3, 4, 5, 6, 7, 8}

  • 使用make()函數(shù)來創(chuàng)建一個切片時,需要指定切片的長度和容量,因為make()函數(shù)需要至少一個參數(shù)來指定切片的長度。如果省略第二個參數(shù),則默認長度和容量相等。

    • 正確定義:make([]int, length)make([]int, length, capacity)

    • 錯誤示例s := make([]int)?

    3、對于一個nil的channel,例如:var ch chan Type,任何發(fā)送或接收操作都會永遠阻塞,因為nil表示該通道并未分配任何內(nèi)存空間,無法進行通信。因此在使用之前需要先對其進行初始化,例如使用make()函數(shù)分配內(nèi)存空間:ch := make(chan Type)

    4、Go語?中,常量?法尋址, 是不能進?取指針操作

    5、?緩沖的channel是同步的,?有緩沖的channel是?同步的;

    ????在Go語言中,無緩沖的channel是同步的,因為它在發(fā)送和接收操作時都會阻塞當前的goroutine,直到另一個goroutine準備好進行相反的操作,從而進行數(shù)據(jù)的同步交換。舉個例子,當我們在無緩沖的通道中進行發(fā)送操作時,如果接收方?jīng)]有準備好進行接收,發(fā)送操作會被阻塞,直到接收方準備好為止,反之亦然。相反,有緩沖的channel是非同步的,因為它在發(fā)送和接收操作時不會總是阻塞當前的goroutine,除非通道已滿或為空。

    6、nil切片和空切片有什么區(qū)別

    nil切片是一個未分配內(nèi)存空間的切片,其長度和容量均為0,表示該切片變量尚未指向任何底層數(shù)組,無指向任何實際的地址。使用nil切片時需要注意避免空指針引用, 定義一個nil切片: var s? [ ]int

    空切片是一個長度為0的切片,表示一個空集合,分配了內(nèi)存,可以用于表示一個沒有元素的切片,空切片是合法的切片,可以進行賦值和傳參等操作,空切片有實際的地址,是個固定值??? ?

    7、字符串轉成byte數(shù)組,會發(fā)生內(nèi)存拷貝嗎? ?會

    這是因為Go語言的字符串底層實現(xiàn)是不可變的,即一個字符串變量在被創(chuàng)建后,其底層字節(jié)數(shù)組是不允許被修改的。因此,如果我們想要修改一個字符串變量的內(nèi)容,就需要將其轉換為一個可變的字節(jié)切片。字符串是不可變的。

    字符串轉換為字節(jié)切片的函數(shù)是[]byte(str string)。這個函數(shù)會將字符串復制到新的字節(jié)數(shù)組中,因此會發(fā)生內(nèi)存拷貝

    8、頻繁的內(nèi)存拷貝操作對性能不大友好。有沒有什么辦法可以在字符串轉成切片的時候不用發(fā)生拷貝呢?

    在Go語言里面,通過將字符串類型 a 的地址轉換為 unsafe.Pointer 類型的指針,然后再將指針轉換為 *reflect.StringHeader類型的指針,就可以得到一個指向字符串底層數(shù)據(jù)結構的指針,以便在一些底層操作中使用,比如進行指針運算或進行類型轉換等

(*reflect.StringHeader)(unsafe.Pointer(&a))
//字符串在go底層結構
type StringHeader struct {
 ? ?Data uintptr
 ? ?Len ?int
}

//切片在go底層結構
type SliceHeader struct {
 Data uintptr
 Len ?int
 Cap ?int
}

    9、Goroutine和線程的區(qū)別

    1、輕量級:goroutine比線程更加輕量,goroutine所需要的內(nèi)存大約2kb,所以可以在相同的硬件上創(chuàng)建更多的goroutine,線程需要的內(nèi)存大概1mb,goroutine的銷毀和創(chuàng)建成本比線程低的多

    2、調(diào)度:goroutine是由go語言的運行時系統(tǒng)進行調(diào)度的,而線程是由操作系統(tǒng)進行調(diào)度的,goroutine可以根據(jù)需要在不同的線程之間移動,更好的利用多核的cpu,goroutine采用的是協(xié)作式調(diào)度,但是線程采用的是搶占式調(diào)度

    3、共享內(nèi)存;goroutine中,內(nèi)存訪問受到go語言內(nèi)存模型的限制,所以goroutine共享內(nèi)存的方式和線程不同

    4、錯誤處理:goroutine有自己獨立的錯誤處理機制,可以在不中斷程序的情況下,將錯誤傳遞給其他goroutine或者主程序,線程的錯誤處理通常是基于異常的,一旦異常發(fā)生,程序可能就會崩潰

    總結:goroutine和線程都可以用來實現(xiàn)并發(fā),但是goroutine的輕量級、靈活的調(diào)度,內(nèi)存共享方式和獨立的錯誤處理機制使得它在處理大量并發(fā)任務時更加的高效

    10、make和new的區(qū)別

    ????1、make只能用來分配以及初始化類型為slice,map,chan的數(shù)據(jù),返回的類型就是這三個類型本身(實例),而不是他們的指針類型,這三種類型本來就是引用類型,沒必要返回他們的指針,而new可以分配任意類型的數(shù)據(jù),分配返回的是指針,它指向的內(nèi)存空間是連續(xù)的,并且已經(jīng)被初始化為0,這個內(nèi)存空間的大小由size來決定,即類型*Type

    ????2、make 函數(shù)會分配一段內(nèi)存空間,并初始化一個通道對象。通道對象包含了一個緩沖區(qū)和一些元數(shù)據(jù),用于協(xié)調(diào)通信和同步操作。例如,make(chan int) 會創(chuàng)建一個無緩沖的整型通道,并初始化一個通道對象。

    總之,make 函數(shù)會為對象分配內(nèi)存空間,并將其初始化為對應類型的默認值。這個默認值可能是零值,也可能是其他值,具體取決于類型的定義。

    11、Go 語?是如何實現(xiàn)切?擴容的

    當切片的元素個數(shù)超過其容量時:

  • 如果原切片的容量小于1024個元素,則新的切片容量將擴大為原來的兩倍。

  • 如果原切片的容量大于等于1024個元素,則新的切片容量將增加25%。






Go語言面試題的評論 (共 條)

分享到微博請遵守國家法律
彰化市| 虹口区| 屯昌县| 嘉兴市| 台南县| 大埔县| 观塘区| 桂东县| 镇赉县| 大同县| 白玉县| 南投市| 金堂县| 天气| 蒙城县| 兰州市| 台江县| 清原| 葫芦岛市| 南部县| 花垣县| 三穗县| 肥东县| 无棣县| 新泰市| 柯坪县| 肇州县| 新蔡县| 即墨市| 嘉鱼县| 怀远县| 喜德县| 许昌县| 吴桥县| 杨浦区| 郴州市| 依安县| 五原县| 柏乡县| 赤城县| 金平|