欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO必知必會(huì)的常見面試題匯總

 更新時(shí)間:2022年08月16日 08:48:07   作者:王中陽Go  
這篇文章主要為大家介紹了GO必知必會(huì)的常見面試題匯總

引言

今年互聯(lián)網(wǎng)的就業(yè)環(huán)境真的好糟糕啊,好多朋友被優(yōu)化。

我們平常在工作中除了擼好代碼,跑通項(xiàng)目之外,還要注意內(nèi)外兼修。內(nèi)功和招式都得練??,才能應(yīng)對(duì)突如其來的變故,順利的拿到新的offer,不要問我怎么知道的。

這個(gè)月我會(huì)整理分享一系列后端工程師求職面試相關(guān)的文章,知識(shí)脈絡(luò)圖如下:

  • JAVA/GO/PHP 面試常問的知識(shí)點(diǎn)
  • DB:MySql PgSql
  • Cache: Redis MemCache MongoDB
  • 數(shù)據(jù)結(jié)構(gòu)
  • 算法
  • 微服務(wù)&高并發(fā)
  • 流媒體
  • WEB3.0
  • 源碼分析

通過這一系列的文章,大家不僅能溫習(xí)和梳理后端開發(fā)相關(guān)的知識(shí)點(diǎn),也可以了解目前的市場環(huán)境對(duì)服務(wù)端開發(fā),尤其是對(duì)Go開發(fā)工程師的崗位要求,需要掌握哪些核心技術(shù)。

值類型和引用類型

值類型有哪些?

基本數(shù)據(jù)類型都是值類型,包括:int系列、float系列、bool、字符串、數(shù)組、結(jié)構(gòu)體struct。

引用類型有哪些?

指針、切片slice、接口interface、管道channel

值類型和引用類型的區(qū)別?

  • 值類型在內(nèi)存中存儲(chǔ)的是值本身,而引用類型在內(nèi)存中存儲(chǔ)的是值的內(nèi)存地址。
  • 值類型內(nèi)存通常在棧中分配,引用類型內(nèi)存通常在堆中分配。

垃圾回收

引用類型的內(nèi)存在堆中分配,當(dāng)沒有任何變量引用堆中的內(nèi)存地址時(shí),該內(nèi)存地址對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)空間就變成了垃圾,就會(huì)被GO語言的GC回收。

一圖勝千言

堆和棧

在Go中,棧的內(nèi)存是由編譯器自動(dòng)進(jìn)行分配和釋放,棧區(qū)往往存儲(chǔ)著函數(shù)參數(shù)、局部變量和調(diào)用函數(shù)幀,它們隨著函數(shù)的創(chuàng)建而分配,函數(shù)的退出而銷毀。

一個(gè)goroutine對(duì)應(yīng)一個(gè)棧,棧是調(diào)用棧(call stack)的簡稱。一個(gè)棧通常又包含了許多棧幀(stack frame),它描述的是函數(shù)之間的調(diào)用關(guān)系,每一幀對(duì)應(yīng)一次尚未返回的函數(shù)調(diào)用,它本身也是以棧形式存放數(shù)據(jù)。

與棧不同的是,應(yīng)用程序在運(yùn)行時(shí)只會(huì)存在一個(gè)堆。狹隘地說,內(nèi)存管理只是針對(duì)堆內(nèi)存而言的。程序在運(yùn)行期間可以主動(dòng)從堆上申請內(nèi)存,這些內(nèi)存通過Go的內(nèi)存分配器分配,并由垃圾收集器回收。

切片

比較

切片之間是不能比較的,我們不能使用==操作符來判斷兩個(gè)切片是否含有全部相等元素。

切片唯一合法的比較操作是和nil比較。

比較的詳解

要檢查切片是否為空,應(yīng)該使用

len(s) == 0

來判斷,而不應(yīng)該使用

s == nil

來判斷。

原因是:一個(gè)nil值的切片并沒有底層數(shù)組,一個(gè)nil值的切片的長度和容量都是0。但是我們不能說一個(gè)長度和容量都是0的切片一定是nil。

我們通過下面的示例就很好理解了:

var s1 []int            //len(s1)=0;cap(s1)=0;s1==nil
s2 := []int{}           //len(s2)=0;cap(s2)=0;s2!=nil
s3 := make([]int, 0)    //len(s3)=0;cap(s3)=0;s3!=nil

所以要判斷一個(gè)切片是否是空的,要是用len(s) == 0來判斷,不應(yīng)該使用s == nil來判斷。

其根本原因在于后面兩種初始化方式已經(jīng)給切片分配了空間,所以就算切片為空,也不等于nil。但是len(s) == 0成立,則切片一定為空。

注意:在go中 var是聲明關(guān)鍵字,不會(huì)開辟內(nèi)存空間;使用 := 或者 make 關(guān)鍵字進(jìn)行初始化時(shí)才會(huì)開辟內(nèi)存空間。

深拷貝和淺拷貝

操作對(duì)象

深拷貝和淺拷貝操作的對(duì)象都是Go語言中的引用類型

區(qū)別如下:

引用類型的特點(diǎn)是在內(nèi)存中存儲(chǔ)的是其他值的內(nèi)存地址;而值類型在內(nèi)存中存儲(chǔ)的是真實(shí)的值。

我們在go語言中通過 := 賦值引用類型就是 淺拷貝,即拷貝的是內(nèi)存地址,兩個(gè)變量對(duì)應(yīng)的是同一個(gè)內(nèi)存地址對(duì)應(yīng)的同一個(gè)值。

a := []string{1,2,3} 
b := a

如果我們通過copy()函數(shù)進(jìn)行賦值,就是深拷貝,賦值的是真實(shí)的值,而非內(nèi)存地址,會(huì)在內(nèi)存中開啟新的內(nèi)存空間。

舉例如下:

a := []string{1,2,3} 
b := make([]string,len(a),cap(a)) 
copy(b,a)

new和make

new

new是GO語言一個(gè)內(nèi)置的函數(shù),它的函數(shù)簽名如下:

func new(Type) *Type

特點(diǎn)

  • Type表示類型,new函數(shù)只接受一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)類型
  • *Type表示類型指針,new函數(shù)返回一個(gè)指向該類型內(nèi)存地址的指針。

new函數(shù)不太常用,使用new函數(shù)得到的是一個(gè)類型的指針,并且該指針對(duì)應(yīng)的值為該類型的零值。

舉個(gè)例子:

func main() {
    a := new(int) 
    b := new(bool)
    fmt.Printf("%T\n", a) // *int 
    fmt.Printf("%T\n", b) // *bool 
    fmt.Println(*a) // 0 
    fmt.Println(*b) // false 
}

使用技巧

var a *int只是聲明了一個(gè)指針變量a但是沒有初始化,指針作為引用類型需要初始化后才會(huì)擁有內(nèi)存空間,才可以給它賦值。

應(yīng)該按照如下方式使用內(nèi)置的new函數(shù)對(duì)a進(jìn)行初始化之后就可以正常對(duì)其賦值了:

    func main() {
    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)
}

make

make也是用于內(nèi)存分配的,區(qū)別于new,它只用于slice、map以及channel的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個(gè)類型本身,而不是他們的指針類型,因?yàn)檫@三種類型就是引用類型(指針類型),所以就沒有必要返回他們的指針了。

make函數(shù)的函數(shù)簽名

func make(t Type, size ...IntegerType) Type

特點(diǎn)

make函數(shù)是無可替代的,我們在使用slice、map以及channel的時(shí)候,都需要使用make進(jìn)行初始化,然后才可以對(duì)它們進(jìn)行操作。

使用技巧

var b map[string]int這段代碼,只是聲明變量b是一個(gè)map類型的變量,需要像下面的示例代碼一樣使用make函數(shù)進(jìn)行初始化操作之后,才能對(duì)其進(jìn)行鍵值對(duì)賦值:

func main() { 
    var b map[string]int 
    b = make(map[string]int, 10) 
    b["分?jǐn)?shù)"] = 100 
    fmt.Println(b)
}

小結(jié):new與make的區(qū)別

  • 二者都是用來做內(nèi)存分配的。
  • make只用于slice、map以及channel的初始化,返回的是類型本身(類型本身就是引用類型(指針類型));
  • 而new用于內(nèi)存分配時(shí),在內(nèi)存中存儲(chǔ)的是對(duì)應(yīng)類型的型零值(比如0,false),返回的是該類型的指針類型。

go的map實(shí)現(xiàn)排序

我們知道go語言的map類型底層是有hash實(shí)現(xiàn)的,是無序的,不支持排序。

如果我們的數(shù)據(jù)使用map類型存儲(chǔ),如何實(shí)現(xiàn)排序呢?

解決思路

排序map的key,再根據(jù)排序后的key遍歷輸出map即可。

代碼實(shí)現(xiàn):

package main
import (
   "fmt"
   "math/rand"
   "sort"
   "time"
)
func main() {
   rand.Seed(time.Now().UnixNano()) //初始化隨機(jī)數(shù)種子
   var scoreMap = make(map[string]int, 30)
   for i := 0; i < 30; i++ {
      key := fmt.Sprintf("stu%02d", i) //生成stu開頭的字符串
      value := rand.Intn(30)           //生成0~50的隨機(jī)整數(shù)
      scoreMap[key] = value
   }
   //取出map中的所有key存入切片keys
   var keys = make([]string, 0, 30)
   for key := range scoreMap {
      keys = append(keys, key)
   }
   //對(duì)切片進(jìn)行排序
   sort.Strings(keys)
   //按照排序后的key遍歷map
   for _, key := range keys {
      fmt.Println(key, scoreMap[key])
   }
}

運(yùn)行結(jié)果

逃逸分析

逃逸分析比較硬核,單獨(dú)寫了一篇文章:# 【狂刷面試題】Go逃逸分析詳解

最后,聽我說

不用好奇我為什么會(huì)出這個(gè)系列的文章,沒錯(cuò),我最近處于失業(yè)狀態(tài),所以掘金也斷更了好久,疲于奔命的在為拿到新offer而奮斗,好在花了2周的時(shí)間拿到了新的offer。

在此衷心的勸誡各位小伙伴:如果你對(duì)你的工作不滿意,請三思再三思之后再離職,尤其不要傲嬌的裸辭。

如果你的公司或者你的部門發(fā)展的還不錯(cuò),請你加倍珍惜這份工作,踏踏實(shí)實(shí),為公司發(fā)光發(fā)熱,貢獻(xiàn)力量,把不斷學(xué)習(xí)的口號(hào)轉(zhuǎn)化成落地輸出的行動(dòng),真真正正的做到肉眼可見的提高。

如果你也和我一樣不幸被離職,請不要沮喪更不要抱怨,快速調(diào)整負(fù)面情緒,進(jìn)一步提升自己才是王道。

福禍相依:禍兮福之所倚,福兮禍之所伏。

暫時(shí)的失意放在人生的長河中算不上什么,我們要做的應(yīng)該是盡快收拾起行囊,朝著下一個(gè)更美好的前方走去,哪怕路上會(huì)磕磕絆絆,但是我們一定會(huì)抬足向前。

以上就是GO必知必會(huì)的常見面試題匯總的詳細(xì)內(nèi)容,更多關(guān)于GO面試題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言使用MySql的方法

    Go語言使用MySql的方法

    這篇文章主要介紹了Go語言使用MySql的方法,實(shí)例分析了Go語言操作MySQL的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之import導(dǎo)包和初始化詳解,需要的朋友可以參考下
    2022-04-04
  • GoFrame錯(cuò)誤處理常用方法及錯(cuò)誤碼使用示例

    GoFrame錯(cuò)誤處理常用方法及錯(cuò)誤碼使用示例

    這篇文章主要為大家介紹了GoFrame錯(cuò)誤處理常用方法及錯(cuò)誤碼使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go并發(fā)編程實(shí)踐

    Go并發(fā)編程實(shí)踐

    并發(fā)編程一直是Golang區(qū)別與其他語言的很大優(yōu)勢,也是實(shí)際工作場景中經(jīng)常遇到的。近日筆者在組內(nèi)分享了我們常見的并發(fā)場景,及代碼示例,以期望大家能在遇到相同場景下,能快速的想到解決方案,或者是拿這些方案與自己實(shí)現(xiàn)的比較,取長補(bǔ)短?,F(xiàn)整理出來與大家共享
    2017-01-01
  • Go如何實(shí)現(xiàn)json字符串與各類struct相互轉(zhuǎn)換

    Go如何實(shí)現(xiàn)json字符串與各類struct相互轉(zhuǎn)換

    這篇文章主要介紹了Go如何實(shí)現(xiàn)json字符串與各類struct相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Go語言編程中判斷文件是否存在是創(chuàng)建目錄的方法

    Go語言編程中判斷文件是否存在是創(chuàng)建目錄的方法

    這篇文章主要介紹了Go語言編程中判斷文件是否存在是創(chuàng)建目錄的方法,示例都是使用os包下的函數(shù),需要的朋友可以參考下
    2015-10-10
  • golang如何獲得一個(gè)變量的類型

    golang如何獲得一個(gè)變量的類型

    這篇文章主要介紹了golang獲得一個(gè)變量類型的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang內(nèi)存對(duì)齊的概念及案例詳解

    golang內(nèi)存對(duì)齊的概念及案例詳解

    為保證程序順利高效的運(yùn)行,編譯器會(huì)把各種類型的數(shù)據(jù)安排到合適的地址,并占用合適的長度,這就是內(nèi)存對(duì)齊。本文重點(diǎn)給大家介紹golang內(nèi)存對(duì)齊的概念及案例詳解,感興趣的朋友一起看看吧
    2022-02-02
  • 詳解Go語言中select語句的常見用法

    詳解Go語言中select語句的常見用法

    這篇文章主要是來和大家介紹一下Go語言中select?語句的常見用法,以及在使用過程中的注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • go語言實(shí)現(xiàn)同步操作項(xiàng)目示例

    go語言實(shí)現(xiàn)同步操作項(xiàng)目示例

    本文主要介紹了go語言實(shí)現(xiàn)同步操作項(xiàng)目示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評(píng)論