日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

騰訊互娛面經(jīng)詳解

來源: 責(zé)編: 時間:2024-05-11 09:17:23 162觀看
導(dǎo)讀先來嘮嘮圖片今天刷脈脈的時候, 發(fā)現(xiàn)百度副總裁璩靜一個人竟然占了前三的兩個熱榜, 對于她的離職你怎么看?言歸正傳, 本文的重點還是分享面經(jīng)干貨今天分享的是一位朋友在騰訊互娛的面經(jīng), 他本人目前已經(jīng)是收到offer了

先來嘮嘮

圖片圖片gk728資訊網(wǎng)——每日最新資訊28at.com

今天刷脈脈的時候, 發(fā)現(xiàn)百度副總裁璩靜一個人竟然占了前三的兩個熱榜, 對于她的離職你怎么看?gk728資訊網(wǎng)——每日最新資訊28at.com

言歸正傳, 本文的重點還是分享面經(jīng)干貨gk728資訊網(wǎng)——每日最新資訊28at.com

今天分享的是一位朋友在騰訊互娛的面經(jīng), 他本人目前已經(jīng)是收到offer了, 讓我們來看看這個難度如何:gk728資訊網(wǎng)——每日最新資訊28at.com

圖片圖片gk728資訊網(wǎng)——每日最新資訊28at.com

面試題詳解

Go接口

接口在Golang中扮演著連接不同類型之間的橋梁,它定義了一組方法的集合,而不關(guān)心具體的實現(xiàn)。接口的作用主要體現(xiàn)在以下幾個方面:gk728資訊網(wǎng)——每日最新資訊28at.com

多態(tài)性:gk728資訊網(wǎng)——每日最新資訊28at.com

接口允許不同的類型實現(xiàn)相同的方法,從而實現(xiàn)多態(tài)性。這意味著我們可以使用接口類型來處理不同的對象,而不需要關(guān)心具體的類型。gk728資訊網(wǎng)——每日最新資訊28at.com

package mainimport "fmt"type Animal interface { Sound() string}type Dog struct{}func (d Dog) Sound() string { return "Woof!"}type Cat struct{}func (c Cat) Sound() string { return "Meow!"}func main() { animals := []Animal{Dog{}, Cat{}} for _, animal := range animals {  fmt.Println(animal.Sound()) }}

在上面的示例中,我們定義了一個Animal接口,它包含了一個Sound()方法。然后,我們實現(xiàn)了Dog和Cat兩個結(jié)構(gòu)體,分別實現(xiàn)了Sound()方法。通過將Dog和Cat類型賦值給Animal接口類型,我們可以在循環(huán)中調(diào)用Sound()方法,而不需要關(guān)心具體的類型。這就體現(xiàn)了接口的多態(tài)性,不同的類型可以實現(xiàn)相同的接口方法。gk728資訊網(wǎng)——每日最新資訊28at.com

解耦合:gk728資訊網(wǎng)——每日最新資訊28at.com

接口可以將抽象與實現(xiàn)分離,降低代碼之間的耦合度。通過定義接口,我們可以將實現(xiàn)細(xì)節(jié)隱藏起來,只暴露必要的方法,從而提高代碼的可維護性和可讀性。gk728資訊網(wǎng)——每日最新資訊28at.com

package mainimport "fmt"type Printer interface { Print(string)}type ConsolePrinter struct{}func (cp ConsolePrinter) Print(message string) { fmt.Println(message)}type FilePrinter struct{}func (fp FilePrinter) Print(message string) { // 將消息寫入文件 fmt.Println("Writing message to file:", message)}func main() { printer := ConsolePrinter{} printer.Print("Hello, World!") printer = FilePrinter{} printer.Print("Hello, World!")}

在上面的示例中,我們定義了一個Printer接口,它包含了一個Print()方法。然后,我們實現(xiàn)了ConsolePrinter和FilePrinter兩個結(jié)構(gòu)體,分別實現(xiàn)了Print()方法。通過將不同的結(jié)構(gòu)體賦值給Printer接口類型的變量,我們可以在主函數(shù)中調(diào)用Print()方法,而不需要關(guān)心具體的實現(xiàn)。這樣,我們可以根據(jù)需要輕松地切換不同的打印方式,實現(xiàn)了解耦合。gk728資訊網(wǎng)——每日最新資訊28at.com

可擴展性:gk728資訊網(wǎng)——每日最新資訊28at.com

package mainimport "fmt"type Shape interface { Area() float64}type Rectangle struct { Width  float64 Height float64}func (r Rectangle) Area() float64 { return r.Width * r.Height}type Circle struct { Radius float64}func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius}func main() { shapes := []Shape{Rectangle{Width: 5, Height: 10}, Circle{Radius: 3}} for _, shape := range shapes {  fmt.Println("Area:", shape.Area()) }}

在上面的示例中,我們定義了一個Shape接口,它包含了一個Area()方法。然后,我們實現(xiàn)了Rectangle和Circle兩個結(jié)構(gòu)體,分別實現(xiàn)了Area()方法。通過將不同的結(jié)構(gòu)體賦值給Shape接口類型的切片,我們可以在循環(huán)中調(diào)用Area()方法,而不需要關(guān)心具體的類型。這樣,當(dāng)我們需要添加新的形狀時,只需要實現(xiàn)Shape接口的Area()方法即可,而不需要修改已有的代碼。這就實現(xiàn)了代碼的可擴展性。gk728資訊網(wǎng)——每日最新資訊28at.com

接口的應(yīng)用場景

  1. API設(shè)計:接口在API設(shè)計中起到了至關(guān)重要的作用。通過定義接口,我們可以規(guī)范API的輸入和輸出,提高代碼的可讀性和可維護性。
  2. 單元測試:接口在單元測試中也扮演著重要的角色。通過使用接口,我們可以輕松地替換被測試對象的實現(xiàn),從而實現(xiàn)對被測代碼的獨立測試。
  3. 插件系統(tǒng):接口可以用于實現(xiàn)插件系統(tǒng),通過定義一組接口,不同的插件可以實現(xiàn)這些接口,并在程序運行時動態(tài)加載和使用插件。
  4. 依賴注入:接口在依賴注入中也有廣泛的應(yīng)用。通過定義接口,我們可以將依賴對象的創(chuàng)建和管理交給外部容器,從而實現(xiàn)松耦合的代碼結(jié)構(gòu)。

空結(jié)構(gòu)體的用途

不包含任何字段的結(jié)構(gòu)體,就叫做空結(jié)構(gòu)體。gk728資訊網(wǎng)——每日最新資訊28at.com

空結(jié)構(gòu)體的特點:gk728資訊網(wǎng)——每日最新資訊28at.com

  1. 零內(nèi)存占用
  2. 地址都相同
  3. 無狀態(tài)

空結(jié)構(gòu)體的使用場景

  • 實現(xiàn)set集合

在 Go 語言中,雖然沒有內(nèi)置 Set 集合類型,但是我們可以利用 map 類型來實現(xiàn)一個 Set 集合。由于 map 的 key 具有唯一性,我們可以將元素存儲為 key,而 value 沒有實際作用,為了節(jié)省內(nèi)存,我們可以使用空結(jié)構(gòu)體作為 value 的值。gk728資訊網(wǎng)——每日最新資訊28at.com

package mainimport "fmt"type Set[K comparable] map[K]struct{}func (s Set[K]) Add(val K) {   s[val] = struct{}{}}func (s Set[K]) Remove(val K) {   delete(s, val)}func (s Set[K]) Contains(val K) bool {   _, ok := s[val]   return ok}func main() {   set := Set[string]{}   set.Add("程序員")   fmt.Println(set.Contains("程序員")) // true   set.Remove("程序員")   fmt.Println(set.Contains("程序員")) // false}
  • 用于通道信號

空結(jié)構(gòu)體常用于 Goroutine 之間的信號傳遞,尤其是不關(guān)心通道中傳遞的具體數(shù)據(jù),只需要一個觸發(fā)信號時。例如,我們可以使用空結(jié)構(gòu)體通道來通知一個 Goroutine 停止工作:gk728資訊網(wǎng)——每日最新資訊28at.com

package main    import (     "fmt"     "time"  )    func main() {     quit := make(chan struct{})     go func() {        // 模擬工作        fmt.Println("工作中...")        time.Sleep(3 * time.Second)        // 關(guān)閉退出信號        close(quit)   }()       // 阻塞,等待退出信號被關(guān)閉     <-quit     fmt.Println("已收到退出信號,退出中...")  }
  • 作為方法接收器

有時候我們需要創(chuàng)建一組方法集的實現(xiàn)(一般來說是實現(xiàn)一個接口),但并不需要在這個實現(xiàn)中存儲任何數(shù)據(jù),這種情況下,我們可以使用空結(jié)構(gòu)體來實現(xiàn):gk728資訊網(wǎng)——每日最新資訊28at.com

type Person interface {   SayHello()   Sleep()}type CMY struct{}func (c CMY) SayHello() {   fmt.Println("你好,世界。")}func (c CMY) Sleep() {   fmt.Println("晚安,世界...")}

Go原生支持默認(rèn)參數(shù)或可選參數(shù)嗎,如何實現(xiàn)

什么是默認(rèn)參數(shù)

默認(rèn)參數(shù)是指在函數(shù)調(diào)用時,如果沒有提供某個參數(shù)的值,那么使用函數(shù)定義中指定的默認(rèn)值。這種語言特性可以減少代碼量,簡化函數(shù)的使用。gk728資訊網(wǎng)——每日最新資訊28at.com

在Go語言中,函數(shù)不支持默認(rèn)參數(shù)。這意味著如果我們想要設(shè)置默認(rèn)值,那么就需要手動在函數(shù)內(nèi)部進行處理。gk728資訊網(wǎng)——每日最新資訊28at.com

例如,下面是一個函數(shù)用于計算兩個整數(shù)的和:gk728資訊網(wǎng)——每日最新資訊28at.com

func Add(a int, b int) int {       return a + b}

如果我們希望b參數(shù)有一個默認(rèn)值,例如為0,那么可以在函數(shù)內(nèi)部進行處理:gk728資訊網(wǎng)——每日最新資訊28at.com

func AddWithDefault(a int, b int) int {       if b == 0 {           b = 0    }    return a + b}

上面的代碼中,如果b參數(shù)沒有提供值,那么默認(rèn)為0。通過這種方式,我們就實現(xiàn)了函數(shù)的默認(rèn)參數(shù)功能。gk728資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,這種處理方式雖然可以實現(xiàn)默認(rèn)參數(shù)的效果,但會增加代碼復(fù)雜度和維護難度,因此在Go語言中不被推薦使用。gk728資訊網(wǎng)——每日最新資訊28at.com

什么是可選參數(shù)

可選參數(shù)是指在函數(shù)調(diào)用時,可以省略一些參數(shù)的值,從而讓函數(shù)更加靈活。這種語言特性可以讓函數(shù)更加易用,提高代碼的可讀性。gk728資訊網(wǎng)——每日最新資訊28at.com

在Go語言中,函數(shù)同樣不支持可選參數(shù)。但是,我們可以使用可變參數(shù)來模擬可選參數(shù)的效果。gk728資訊網(wǎng)——每日最新資訊28at.com

下面是一個函數(shù)用于計算任意個整數(shù)的和:gk728資訊網(wǎng)——每日最新資訊28at.com

func Add(nums ...int) int {       sum := 0    for _, num := range nums {           sum += num    }    return sum}

上面的代碼中,我們使用...int類型的可變參數(shù)來接收任意個整數(shù),并在函數(shù)內(nèi)部進行求和處理。gk728資訊網(wǎng)——每日最新資訊28at.com

如果我們希望b和c參數(shù)為可選參數(shù),那么可以將它們放到nums可變參數(shù)之后:gk728資訊網(wǎng)——每日最新資訊28at.com

func AddWithOptional(a int, nums ...int) int {       sum := a    for _, num := range nums {           sum += num    }    return sum}

上面的代碼中,我們首先將a參數(shù)賦值給sum變量,然后對可變參數(shù)進行求和處理。如果函數(shù)調(diào)用時省略了nums參數(shù),則sum等于a的值。gk728資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,使用可變參數(shù)模擬可選參數(shù)的效果雖然能夠?qū)崿F(xiàn)函數(shù)的靈活性,但也會降低代碼的可讀性和規(guī)范性。因此在Go語言中不被推薦使用。gk728資訊網(wǎng)——每日最新資訊28at.com

defer執(zhí)行順序

在 Go 中,defer 語句用于延遲(defer)函數(shù)的執(zhí)行,通常用于在函數(shù)執(zhí)行結(jié)束前執(zhí)行一些清理或收尾工作。當(dāng)函數(shù)中存在多個 defer 語句時,它們的執(zhí)行順序是“后進先出”(Last In First Out,LIFO)的,即最后一個被延遲的函數(shù)最先執(zhí)行,倒數(shù)第二個被延遲的函數(shù)次之,以此類推。gk728資訊網(wǎng)——每日最新資訊28at.com

在 Go 中,defer 語句中的函數(shù)在執(zhí)行時會被壓入一個棧中,當(dāng)函數(shù)執(zhí)行結(jié)束時,這些被延遲的函數(shù)會按照后進先出的順序執(zhí)行。這意味著在函數(shù)中的 defer 語句中的函數(shù)會在函數(shù)執(zhí)行結(jié)束前執(zhí)行,包括在 return 語句之前執(zhí)行。gk728資訊網(wǎng)——每日最新資訊28at.com

協(xié)程之間信息如何同步

協(xié)程(Goroutine)之間的信息同步通常通過通道(Channel)來實現(xiàn)。通道是 Go 語言中用于協(xié)程之間通信的重要機制,可以安全地在不同協(xié)程之間傳遞數(shù)據(jù),實現(xiàn)協(xié)程之間的信息同步。gk728資訊網(wǎng)——每日最新資訊28at.com

一些常見的方法來實現(xiàn)協(xié)程之間的信息同步:gk728資訊網(wǎng)——每日最新資訊28at.com

  1. 使用無緩沖通道:無緩沖通道是一種同步通道,發(fā)送和接收操作會在數(shù)據(jù)準(zhǔn)備好之前被阻塞。通過無緩沖通道,可以實現(xiàn)協(xié)程之間的同步通信,確保數(shù)據(jù)的正確傳遞。
  2. 使用帶緩沖通道:帶緩沖通道允許在通道中存儲一定數(shù)量的元素,發(fā)送操作只有在通道已滿時才會被阻塞。通過帶緩沖通道,可以實現(xiàn)異步通信。
  3. 使用同步原語:Go 語言中的 sync 包提供了一些同步原語,如互斥鎖(Mutex)、讀寫鎖(RWMutex)等,可以用于協(xié)程之間的同步訪問共享資源。
  4. 使用select語句:select 語句可以用于在多個通道操作中選擇一個執(zhí)行,可以實現(xiàn)協(xié)程之間的多路復(fù)用和超時控制。
  5. 使用context包:context 包提供了一種在協(xié)程之間傳遞取消信號和截止時間的機制,可以用于協(xié)程之間的協(xié)調(diào)和同步。

GMP模型

GM模型開銷大的原因?

最開始的是GM模型沒有 P 的,是M:N的兩級線程模型,但是會出現(xiàn)一些性能問題:gk728資訊網(wǎng)——每日最新資訊28at.com

  • 全局隊列的鎖競爭。M從全局隊列中添加或獲取 G 的時候,都是需要上鎖的(下圖執(zhí)行步驟要加鎖),這樣就會導(dǎo)致鎖競爭,雖然達(dá)到了并發(fā)安全,但是性能是非常差的。
  • M 轉(zhuǎn)移 G 會有額外開銷。M 在執(zhí)行 G 的時候,假設(shè) M1 執(zhí)行的 G1 創(chuàng)建了 G2,新創(chuàng)建的就要放到全局隊列中去,但是這時有一個空閑的 M2 獲取到了 G2,那么這樣 G1、G2 會被不同的 M 執(zhí)行,但是 M1 中本來就有 G2 的信息,M2 在 G1 上執(zhí)行是更好的,而且取和放到全局隊列也會來回加鎖,這樣都會有一部分開銷。
  • 線程的使用效率不能最大化。M 拿不到的時候就會一直空閑,阻塞的時候也不會切換。也就是沒有 workStealing 機制和 handOff 機制。

gk728資訊網(wǎng)——每日最新資訊28at.com

轉(zhuǎn)載本文請聯(lián)系「王中陽Go」公眾號。gk728資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87961-0.html騰訊互娛面經(jīng)詳解

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 這是一篇給Java初學(xué)者看的JVM文章

下一篇: 異步編程在C#中的應(yīng)用:深入理解Task

標(biāo)簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質(zhì)感拉滿

    終于,在經(jīng)過了幾波預(yù)熱之后,一加Ace2 Pro的外觀真機圖在網(wǎng)上出現(xiàn)了。還是博主數(shù)碼閑聊站曝光的,這次的外觀設(shè)計還是延續(xù)了一加11的方案,只是細(xì)節(jié)上有了調(diào)整,例如新加入了鈦空灰
  • Mate60手機殼曝光 致敬自己的經(jīng)典設(shè)計

    8月3日消息,今天下午博主數(shù)碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發(fā)布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達(dá)到了中國第一,同時還表示小米電視的巨屏風(fēng)暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 微軟邀請 Microsoft 365 商業(yè)用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請用戶通過該應(yīng)用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網(wǎng)友或許聽過,但應(yīng)該不記得她是哪位主播了。其實,作為曾經(jīng)的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領(lǐng)先地位的英特爾,甚至初成立不久的新
Top 主站蜘蛛池模板: 青河县| 凤凰县| 和龙市| 雷州市| 揭西县| 鄂伦春自治旗| 平山县| 逊克县| 庐江县| 岳西县| 奉化市| 武义县| 武功县| 来凤县| 巴林右旗| 建昌县| 福贡县| 德化县| 达日县| 芜湖市| 嘉禾县| 中卫市| 阳高县| 金寨县| 崇义县| 大足县| 五常市| 怀安县| 秦皇岛市| 苍南县| 永靖县| 梁山县| 治多县| 共和县| 陆丰市| 白银市| 安平县| 夹江县| 乐昌市| 西乌珠穆沁旗| 阿克|