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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;创建新项目项目结构…