5.28 后端面經

為什么golang在并發環境下更有優勢

Go語言(Golang)在并發環境下的優勢主要源自其設計哲學和內置的并發機制,這些機制在語言層面提供了高效、簡潔且安全的并發編程工具。以下是其核心優勢的詳細分析:


1. Goroutine:輕量級并發單元

  • 輕量級:Golang的goroutine是用戶級線程(協程),啟動時僅需 2KB 的棧內存(動態擴展),而傳統線程通常需要 1MB+。這使得程序可以輕松創建成千上萬個并發任務,而不會因資源耗盡導致崩潰。
  • 低啟動開銷:創建和銷毀goroutine的代價極低(納秒級),無需依賴操作系統的線程管理,適合高頻短任務的場景(如處理HTTP請求)。
  • 自動調度:Go運行時(runtime)通過調度器自動管理goroutine的生命周期,開發者無需手動管理線程池。

2. GMP 調度模型:高效的并發調度

Go的調度器采用 M:N 模型(多對多調度),將大量goroutine映射到少量操作系統線程(OS Thread)上,核心組件包括:

  • G(Goroutine):并發任務單元。
  • M(Machine):操作系統線程,由內核調度。
  • P(Processor):邏輯處理器,管理本地goroutine隊列(每個P綁定一個M)。

優勢

  • 工作竊取(Work Stealing):空閑的P會從其他P的隊列中“竊取”goroutine,實現負載均衡。
  • 非阻塞系統調用:當goroutine觸發系統調用(如I/O)時,調度器會將M與P解綁,避免線程阻塞,并立即分配新的M執行其他任務。
  • 用戶態調度:減少內核態與用戶態的切換開銷,上下文切換成本低于線程。

3. Channel:基于通信的并發同步

Golang通過 CSP(Communicating Sequential Processes)模型,提倡“通過通信共享內存,而非通過共享內存通信”:

  • Channel(通道):類型安全的管道,用于goroutine間的數據傳輸和同步。
    • 避免顯式鎖(如Mutex),減少競態條件和死鎖風險。
    • 支持阻塞式同步(如無緩沖Channel)或異步緩沖(有緩沖Channel)。
  • Select 多路復用:通過select語句監聽多個Channel,簡化事件驅動編程。

示例

ch := make(chan int)
go func() {result := compute()ch <- result // 發送結果到Channel
}()
value := <-ch    // 等待并接收結果

對比傳統線程模型

特性Golang (Goroutine)傳統線程(如Java/Python)
內存占用2KB起步,動態擴展1MB+(固定棧)
創建/銷毀開銷納秒級微秒級
調度方式用戶態調度(高效)內核態調度(上下文切換慢)
并發同步機制Channel(避免鎖競爭)依賴鎖(易死鎖/競態)
開發復雜度低(語法內建支持)高(需手動管理線程池/鎖)

總結

Go語言的并發優勢源于輕量級Goroutine、高效調度器、Channel通信模型以及標準庫的全方位支持,使得開發者能夠以簡潔的代碼構建高并發、高性能的系統,同時降低傳統并發編程的復雜性。這些特性使Go成為云原生、微服務和實時系統的首選語言。

說一下什么是虛擬地址?如果沒有虛擬地址,只有物理地址可以嗎?

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

說一下線程間是如何進行通訊

在這里插入圖片描述
在這里插入圖片描述

go設計模式有了解過嗎

參考:https://blog.csdn.net/weixin_45565886/article/details/136098371

簡單工廠模式

go 語言沒有構造函數,所以我們一般是通過 NewXXX 函數來初始化相關類。 NewXXX 函數返回接口時就是簡單工廠模式,也就是說 Golang 的一般推薦做法就是簡單工廠。

工廠方法模式

Go 中不存在繼承 所以使用匿名組合來實現

示例步驟:

定義接口type operator interface
參數a
參數b
result:具體業務方法
定義type BaseFactory struct:提供方法,用于設置a、b參數
參數a
參數b
根據不同操作,定義不同工廠類(addFactory、minusFactory)
addFactory實現operator的result:a+b
minusFactory實現operator的result:a-b
addFactory、minusFactory分別提供Create方法
簡單工廠:唯一工廠類,一個產品抽象類,工廠類的創建方法依據入參判斷并創建具體產品對象
工廠方法:多個工廠類,一個產品抽象類,利用多態創建不同的產品對象,避免了大量的if-else判斷。
抽象工廠:多個工廠類,多個產品抽象類,產品子類分組,同一個工廠實現類創建同組中的不同產品,減少了工廠子類的數量。

package mainimport "fmt"/*
> - 簡單工廠:唯一工廠類,一個產品抽象類,工廠類的創建方法依據入參判斷并創建具體產品對象。
> - 工廠方法:多個工廠類,一個產品抽象類,利用多態創建不同的產品對象,避免了大量的if-else判斷。
> - 抽象工廠:多個工廠類,多個產品抽象類,產品子類分組,同一個工廠實現類創建同組中的不同產品,減少了工廠子類的數量。
*/// Operator 被封裝的實際接口
type Operator interface {SetA(int)SetB(int)Result() int
}// OperatorFactory 是工廠接口
type OperatorFactory interface {Create() Operator
}// OperatorBase 是Operator 接口實現的基類,封裝公用方法
type OperatorBase struct {a, b int
}func (o *OperatorBase) SetA(a int) {o.a = a
}func (o *OperatorBase) SetB(b int) {o.b = b
}// PlusOperatorFactory  加法運算的工廠類
type PlusOperatorFactory struct{}type PlusOperator struct {*OperatorBase
}func (p *PlusOperator) Result() int {return p.a + p.b
}func (p PlusOperatorFactory) Create() Operator {return &PlusOperator{OperatorBase: &OperatorBase{},}
}// MinusOperatorFactory  減法運算的工廠類
type MinusOperatorFactory struct {*OperatorBase
}func (p *MinusOperatorFactory) Result() int {return p.a - p.b
}func (p *MinusOperatorFactory) Create() Operator {return &MinusOperatorFactory{OperatorBase: &OperatorBase{},}
}func main() {//加法plusFactory := PlusOperatorFactory{}plusOperator := plusFactory.Create()plusOperator.SetA(10)plusOperator.SetB(20)result := plusOperator.Result()fmt.Println("plusOperator=", result)//減法minusFactory := MinusOperatorFactory{}minusOperator := minusFactory.Create()minusOperator.SetA(10)minusOperator.SetB(5)result = minusOperator.Result()fmt.Println("minusOperator=", result)
}

創建者模式

將build一個物品拆分為幾個部分

package mainimport "fmt"// Goods 構建的對象
type Goods struct {Name  stringPrice float64Count int
}// GoodsBuilder 構建器
type GoodsBuilder interface {SetName(name string) GoodsBuilderSetPrice(price float64) GoodsBuilderSetCount(count int) GoodsBuilderBuild() *Goods
}// ConcreteBuilder 具體構建器
type ConcreteBuilder struct {goods *Goods
}func (g ConcreteBuilder) Build() *Goods {return g.goods
}func (g ConcreteBuilder) SetName(name string) GoodsBuilder {g.goods.Name = namereturn g
}func (g ConcreteBuilder) SetPrice(price float64) GoodsBuilder {g.goods.Price = pricereturn g
}func (g ConcreteBuilder) SetCount(count int) GoodsBuilder {g.goods.Count = countreturn g
}func NewGoodsBuilder() GoodsBuilder {return &ConcreteBuilder{goods: &Goods{},}
}func main() {builder := NewGoodsBuilder()goods := builder.SetName("apple").SetCount(2).SetPrice(65.0).Build()fmt.Println(goods)
}

單例模式

懶漢式:用到時才實例化(GetInstance),通過once.Do保證只加載一次
餓漢式:一開始就實例化(init)

package mainimport ("fmt""sync"
)// 懶漢式:用到才加載【餓漢式:直接放在init方法里,程序一啟動就創建好】
var (instance *Singletononce     = sync.Once{}
)type Singleton struct {
}func GetInstance() *Singleton {once.Do(func() {instance = &Singleton{}})return instance
}func main() {one := GetInstance()two := GetInstance()//one=0x100f54088//two=0x100f54088fmt.Printf("one=%p\n", one)fmt.Printf("two=%p\n", two)
}

https講一下,如何進行加密的

在這里插入圖片描述
HTTPS 通過 SSL/TLS 協議對通信數據進行加密,確保數據在傳輸過程中不被竊取或篡改。其核心加密機制結合了對稱加密非對稱加密,并通過數字證書驗證身份。以下是具體流程:


一、SSL/TLS 握手(建立安全連接)

  1. 客戶端發起請求
    瀏覽器訪問 HTTPS 網站時,發送支持的加密算法列表(如 RSA、ECDHE)和 TLS 版本。

  2. 服務器響應
    服務器選擇加密算法,并返回數字證書(包含公鑰、域名、簽發機構等信息)。

  3. 證書驗證

    • 瀏覽器檢查證書是否由受信任的證書頒發機構(CA)簽發。
    • 驗證證書是否過期、域名是否匹配,防止中間人攻擊。

二、密鑰交換(核心加密步驟)

  1. 非對稱加密傳遞對稱密鑰

    • 瀏覽器生成一個隨機數(Pre-master Secret),用證書中的公鑰加密后發送給服務器。
    • 服務器用私鑰解密獲取 Pre-master Secret。
  2. 生成會話密鑰
    雙方根據 Pre-master Secret 和握手階段的隨機數,生成相同的對稱密鑰(如 AES 密鑰),后續通信使用此密鑰加密數據。

為什么混合使用兩種加密?

  • 非對稱加密(如 RSA)安全性高,但計算慢,適合交換密鑰。
  • 對稱加密(如 AES)速度快,適合加密大量數據。

三、加密數據傳輸

  • 握手完成后,雙方使用對稱密鑰加密所有通信內容。
  • 即使數據被截獲,攻擊者無法解密(沒有密鑰)。

四、關鍵技術支持

  1. 數字證書

    • 由 CA 頒發,證明服務器身份,防止偽造。
    • 包含公鑰、域名、有效期等信息,并由 CA 私鑰簽名。
  2. 加密算法

    • 非對稱加密:RSA、ECDHE(密鑰交換)。
    • 對稱加密:AES、ChaCha20(數據加密)。
    • 散列算法:SHA-256(驗證數據完整性)。
  3. 完整性校驗
    使用 HMAC 或 AEAD 模式,確保數據未被篡改。


五、總結流程

客戶端 → 服務器:發起請求,支持哪些加密算法?
服務器 → 客戶端:返回證書和選定的算法。
客戶端驗證證書 → 生成隨機密鑰用公鑰加密 → 發送給服務器。
服務器用私鑰解密 → 雙方生成對稱密鑰。
后續通信全部使用對稱密鑰加密。

通過以上步驟,HTTPS 實現了:

  • 機密性(對稱加密數據)
  • 身份認證(數字證書驗證)
  • 完整性(散列算法防篡改)

這使得 HTTPS 成為保護隱私(如密碼、支付信息)的核心技術。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82954.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux線程入門

目錄 Linux線程概念 什么是線程 重新理解進程 線程的優點 線程的缺點 線程的異常 線程用途 Linux線程概念 什么是線程 在一個程序里的一個執行路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“一個進程內部的控制序列”。一切進程至…

通信應用高速模數轉換器ADC

在5G通信、醫療成像、航空航天及工業自動化等關鍵領域&#xff0c;高速ADC模數轉換器作為信號鏈的“心臟”&#xff0c;其性能直接決定了系統的精度與效率。然而&#xff0c;如何精確測試高速ADC的動態參數、優化設計驗證流程、應對復雜應用場景的挑戰&#xff0c;始終是工程師…

PostgreSQL 中 JSONB 數據類型的深度解析以及如何使用

一、JSONB 核心特性解析 1. 存儲結構與優勢 ??二進制存儲??&#xff1a;將 JSON 數據解析為二進制格式&#xff08;分解鍵值對&#xff0c;去除空格和重復鍵&#xff09;??高效查詢??&#xff1a;支持 GIN/GiST 索引&#xff0c;查詢速度比 JSON 類型快 10 倍??數據…

C++_核心編程_ 左移運算符重載 “<<” 左移運算符

作用&#xff1a;可以輸出自定義數據類型 */ //目標 調用p1,輸出Person 中的屬性 m_A ,m_B &#xff1a; /* #### 4.5.2 左移運算符重載 “<<” 左移運算符 作用&#xff1a;可以輸出自定義數據類型 *///目標 調用p1,輸出Person 中的屬性 m_A ,m_B &#xff1a; class…

thinkphp 5.1 部分知識記錄<一>

1、配置基礎 慣例配置->應用配置->模塊配置->動態配置 慣例配置:核心框架內置的配置文件,無需更改。應用配置:每個應用的全局配置文件(框架安裝后會生成初始的應用配置文件),有部分配置參數僅能在應用配置文件中設置。模塊配置:每個模塊的配置文件(相同的配置…

數據結構 -- 樹相關面試題

二、樹相關的填空題 1.對于一個具有 n 個結點的二叉樹&#xff0c;當它為一棵 ________ 二叉樹時&#xff0c;具有最小高度&#xff0c;即為 ________&#xff1b;當它為一棵單支樹時具有最大高度&#xff0c;即為 ________。 2.對于一個具有 n 個結點的二叉樹&#xff0c;當它…

2025河北CCPC 題解(部分)

簽到題&#xff1a;AC代碼如下 &#xff1a; // Problem: H - What is all you need? // Contest: Virtual Judge - sdccpc20250526 // URL: https://vjudge.net/contest/718568#problem/H // Memory Limit: 1024 MB // Time Limit: 1000 ms // // Powered by CP Editor (ht…

計算機視覺---YOLOv4

YOLOv4&#xff08;You Only Look Once v4&#xff09;于2020年由Alexey Bochkovskiy等人提出&#xff0c;是YOLO系列的重要里程碑。它在YOLOv3的基礎上整合了當時最先進的計算機視覺技術&#xff0c;實現了檢測速度與精度的顯著提升。以下從主干網絡、頸部網絡、頭部檢測、訓練…

OpenCV 第7課 圖像處理之平滑(一)

1. 圖像噪聲 在采集、處理和傳輸過程中,數字圖像可能會受到不同噪聲的干擾,從而導致圖像質量降低、圖像變得模糊、圖像特征被淹沒,而圖像平滑處理就是通過除去噪聲來達到圖像增強的目的。常見的圖像噪聲有椒鹽噪聲、高斯噪聲等。 1.1 椒鹽噪聲 椒鹽噪聲(Salt-and-pepper N…

Spring AI 系列3: Promt提示詞

一、Promt提示詞 Promt提示是引導 AI 模型生成特定輸出的輸入&#xff0c; 提示的設計和措辭會顯著影響模型的響應。 在 Spring AI 中與 AI 模型交互的最低層級&#xff0c;處理提示有點類似于在 Spring MVC 中管理”視圖”。 這涉及創建帶有動態內容占位符的大段文本。 這些占…

隨叫隨到的電力補給:移動充電服務如何重塑用戶體驗?

在快節奏的現代生活中&#xff0c;電力已成為維系日常運轉的隱形血脈。智能手機、電動汽車、便攜設備的普及&#xff0c;讓“電量焦慮”逐漸演變為一種時代癥候。而移動充電服務的興起&#xff0c;正悄然改變這一局面。它像一位隱形的能源管家&#xff0c;隨時響應需求&#xf…

LeetCode 75. 顏色分類 - 雙指針法高效解決(Java實現)

文章目錄 問題描述算法思路&#xff1a;三指針分區法核心思想指針定義 Java實現算法執行流程關鍵問題解析&#xff1a;為什么交換0后不需要重新檢查&#xff1f;交換0時的兩種情況分析詳細解釋&#xff1a; 復雜度分析示例演示&#xff08;輸入&#xff1a;[2,0,2,1,1,0]&#…

【MySQL】C語言連接

要使用C語言連接mysql&#xff0c;需要使用mysql官網提供的庫&#xff0c;大家可以去官網下載 我們使用C接口庫來進行連接 要正確使用&#xff0c;我們需要做一些準備工作: 保證mysql服務有效在官網上下載合適自己平臺的mysql connect庫&#xff0c;以備后用 下載開發庫 s…

NFS 掛載配置與優化最佳實踐指南

文章目錄 NFS 掛載配置與優化最佳實踐指南1. 服務器端配置1.1 安裝 NFS 服務1.2 配置共享目錄常用配置選項說明 1.3 啟動與檢查服務 2. 客戶端掛載2.1 安裝 NFS 客戶端2.2 掛載 NFS 共享2.3 自動掛載 3. 客戶端掛載選項4. 性能優化與故障排查4.1 性能優化建議4.2 常見問題排查 …

3D PDF如何制作?SOLIDWORKS MBD模板定制技巧

SOLIDWORKS制作3D PDF模版 SOLIDWORKS MBD能夠幫助工程師以清晰直觀的方式描述產品尺寸信息。在3D PDF文件中&#xff0c;用戶可以自由旋轉和移動視圖&#xff0c;方便查看模型的各個尺寸細節。 本文將帶您一步步學習如何使用SOLIDWORKS MBD制作專業的3D PDF模板&#xff0c;…

Unity-QFramework框架學習-MVC、Command、Event、Utility、System、BindableProperty

QFramework QFramework簡介 QFramework是一套漸進式、快速開發框架&#xff0c;適用于任何類型的游戲及應用項目&#xff0c;它包含一套開發架構和大量的工具集 QFramework的特性 簡潔性&#xff1a;QFramework 強調代碼的簡潔性和易用性&#xff0c;讓開發者能夠快速上手&a…

R3GAN訓練自己的數據集

簡介 簡介&#xff1a;這篇論文挑戰了"GANs難以訓練"的廣泛觀點&#xff0c;通過提出一個更穩定的損失函數和現代化的網絡架構&#xff0c;構建了一個簡潔而高效的GAN基線模型R3GAN。作者證明了通過合適的理論基礎和架構設計&#xff0c;GANs可以穩定訓練并達到優異…

【PhysUnits】15.1 引入P1后的加一特質(add1.rs)

一、源碼 代碼實現了類型系統中的"加一"操作&#xff08;Add1 trait&#xff09;&#xff0c;用于在編譯期進行數字的增量計算。 //! 加一操作特質實現 / Increment operation trait implementation //! //! 說明&#xff1a; //! 1. Z0、P1,、N1 1&#xff0…

記錄算法筆記(2025.5.29)最小棧

設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂部的元素。int get…

Android高級開發第一篇 - JNI(初級入門篇)

文章目錄 Android高級開發JNI開發第一篇&#xff08;初級入門篇&#xff09;&#x1f9e0; 一、什么是 JNI&#xff1f;? 為什么要用 JNI&#xff1f; ?? 二、開發環境準備開發工具 &#x1f680; 三、創建一個支持 JNI 的 Android 項目第一步&#xff1a;創建新項目項目結構…