golang-麪霸-面試題-真題

僅供學習筆記,若有侵權,請聯繫做者刪除面試

Golang面試真題

一、結構體類型的比較-結構體的比較問題

(1-1)、只有相同的類型的結構體才能夠比較(1 結構體的屬性類型, 2 屬性的順序)
(1-2)、即便兩個結構體的屬性類型和順序相同,可是裏面存在不可比較類型,依然是不能夠直接==比較的。
好比 map,slice 能夠參考用reflflect.DeepEqual方法來進行比較

image.png

二、string與nil賦值問題

2-一、nil空值的賦值
    空值, 空指針,全部Golang中的引用類型均可以用nil進行賦值
    引用類型: interface , function, pointer, map, slice, channel.
2-二、string: 若是表示一個string的空值, 用空字符串來表示 ""
2-三、不可以將nil賦值給一個string類型

image.png

三、常量與內存四區

數據類型的本質
數據類型的做用
內存四區

(1)數據類型的本質:固定內存大小的別名
(2)數據類型的做用:編譯器預算對象或變量分配內存空間的大小
(3)內存四區:數組

image.png
棧區:app

空間較小,要求數據讀寫性能高,數據存放時間較短暫。
由編譯器主動分配和釋放,存放函數的參數值、函數的調用流程方法地址、
局部變量等(局部變量若是產生逃逸現象,可能會掛在在堆區)

堆區:異步

空間充裕,數據存放時間較久。通常由開發者分配及釋放(可是Golang中會根據變量的逃逸現象來選擇是否分配到棧上或堆上),啓動Golang的GC由GC清除機制回動回收。

全局區:函數

靜態全局變量區:
    全局變量的開闢是在程序在main以前就已經放在內存中。並且對
    外徹底可見。即做⽤域在所有代碼中,任何同包代碼都可隨時使
    用,在變量會搞混淆,並且在局部函數中若是同名稱變量使用
    := 賦值會出現編譯錯誤。
常量區:
    (1)常量區也歸屬於全局區,常量爲存放數值字面值單位,即不
    可修改。或者說的有的常量是直接掛鉤字面值的。
    (2)const cl = 10;  cl是字面量10的對等符號。

代碼區:性能

存放代碼邏輯的內存

image.png

四、數組和切片的問題

切片的初始化和追加
slice在通過make初始化,默認的數據的值是0,append是動態額外開闢內存。
slice拼接問題
兩個slice在append的時候,記住須要進行將第2個slice進行...打散再拼接。
如:s1 = append(s1, s2...)

image.png
改寫:
image.png學習

slice中new的使用問題
一、 make只適於slice、map以及channel的初始化(非零值);
    make返回的仍是這三個引用類型自己;
   而new用於類型的內存分配,而且內存置爲零;而new返回的是指向類型的指針。
二、不建議用new來開闢slice , map 和 channel

image.png

五、map-初始化賦值問題

定義map
    一、不推薦  map[string]Student
    map的value student的屬性是不能夠修改的
    二、推薦    map[string]*Student
    map的value student的屬性是能夠修改的

image.png
方法一:(性能比較差)
image.png
方法二:(推薦)
image.pngspa

六、map遍歷問題

不推薦:遍歷map的時候,不要採用range的方式來遍歷
//將數組依次添加到map中
for _, stu := range stus {
    m[stu.Name] = &stu
}
推薦:
//遍歷整個slice數組,依次賦值給map
for i := 0; i < len(stus); i++ {
m[stus[i].Name] = &stus[i]
}
package main

import (
    "fmt"
    )

type student struct {
    Name string
    Age int
}

func main() {
    //定義map
    m := make(map[string]*student)
    //定義student數組
    stus := []student{
        {Name: "zhou", Age: 24},
        {Name: "li", Age: 23},
        {Name: "wang", Age: 22},
    }
    //將數組依次添加到map中
    for _, stu := range stus { 
        m[stu.Name] = &stu
    }
    //打印map
    for k,v := range m {
        fmt.Println(k ,"=>", v.Name)
    }
}

錯誤示範:
image.png
畫圖分析:
image.png3d

正確寫法:
image.png指針

image.png

七、interface的賦值

多態的三要素

一、有interface接口,而且有接口定義的方法。
二、有子類去重寫interface的接口。
三、有父類指針指向⼦類的具體對象

若是People是一個interface類型

var peo People = Stduent{}    錯誤的
var peo People = &Student{}   正確的

image.png

八、interface的內部構造

image.png
上面代碼會輸出什麼?

輸出:BBBBBBB

image.png

空接口:
image.png

image.png
image.png

非空接口:
image.png
image.png

九、interface{} 和 *interface{}

*interface{}自己不是萬能指針, 就是eface結構體的地址。
若是以*interface{}做爲形參,那麼他只可以接收*interface{}類型的實參

image.png

十、channel出現的特殊狀況總結

給一個 nil channel 發送數據,形成永遠阻塞
從一個 nil channel 接收數據,形成永遠阻塞
給一個已經關閉的 channel 發送數據,引發 panic
從一個已經關閉的 channel 接收數據,若是緩衝區中爲空,則返回一個零值
無緩衝的channel是同步的,而有緩衝的channel是非同步的(異步)
15字口訣: 空(nil)讀寫阻塞,寫關閉異常,讀關閉空零

image.png

十一、WaitGroup

image.png

相關文章
相關標籤/搜索