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 握手(建立安全连接)
-
客户端发起请求
浏览器访问 HTTPS 网站时,发送支持的加密算法列表(如 RSA、ECDHE)和 TLS 版本。 -
服务器响应
服务器选择加密算法,并返回数字证书(包含公钥、域名、签发机构等信息)。 -
证书验证
- 浏览器检查证书是否由受信任的证书颁发机构(CA)签发。
- 验证证书是否过期、域名是否匹配,防止中间人攻击。
二、密钥交换(核心加密步骤)
-
非对称加密传递对称密钥
- 浏览器生成一个随机数(Pre-master Secret),用证书中的公钥加密后发送给服务器。
- 服务器用私钥解密获取 Pre-master Secret。
-
生成会话密钥
双方根据 Pre-master Secret 和握手阶段的随机数,生成相同的对称密钥(如 AES 密钥),后续通信使用此密钥加密数据。
为什么混合使用两种加密?
- 非对称加密(如 RSA)安全性高,但计算慢,适合交换密钥。
- 对称加密(如 AES)速度快,适合加密大量数据。
三、加密数据传输
- 握手完成后,双方使用对称密钥加密所有通信内容。
- 即使数据被截获,攻击者无法解密(没有密钥)。
四、关键技术支持
-
数字证书
- 由 CA 颁发,证明服务器身份,防止伪造。
- 包含公钥、域名、有效期等信息,并由 CA 私钥签名。
-
加密算法
- 非对称加密:RSA、ECDHE(密钥交换)。
- 对称加密:AES、ChaCha20(数据加密)。
- 散列算法:SHA-256(验证数据完整性)。
-
完整性校验
使用 HMAC 或 AEAD 模式,确保数据未被篡改。
五、总结流程
客户端 → 服务器:发起请求,支持哪些加密算法?
服务器 → 客户端:返回证书和选定的算法。
客户端验证证书 → 生成随机密钥用公钥加密 → 发送给服务器。
服务器用私钥解密 → 双方生成对称密钥。
后续通信全部使用对称密钥加密。
通过以上步骤,HTTPS 实现了:
- 机密性(对称加密数据)
- 身份认证(数字证书验证)
- 完整性(散列算法防篡改)
这使得 HTTPS 成为保护隐私(如密码、支付信息)的核心技术。
相关文章:

5.28 后端面经
为什么golang在并发环境下更有优势 Go语言(Golang)在并发环境下的优势主要源自其设计哲学和内置的并发机制,这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析: 1. Goroutine:轻量…...

CPP中CAS std::chrono 信号量与Any类的手动实现
前言 CAS(Compare and Swap) 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数:内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时,CAS才会将内存位…...

PHP生成pdf方法
1:第一种方法: 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1:NPM【版本:9.2.0】 1.2:NODE【版本:v18.19.1】 1.3:puppeteer【npm in…...

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)
写在前面的话,为了保持Sceneform-EQR始终是采用最新的filament,每隔一段时间我都会编译filament,并根据新增内容完善Sceneform-EQR。 现由于更换电脑,环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…...

C#中的BeginInvoke和EndInvoke:异步编程的双剑客
文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级
发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电,您都需要提高运营效率,并在资产老化、资源萎缩的情况下,紧跟不断变化的法规。如今,智能系统和技术能够帮助您实现运营转型,提高可视性并实现关键流程自动…...

《软件工程》第 5 章 - 需求分析模型的表示
目录 5.1需求分析与验证 5.1.1 顺序图 5.1.2 通信图 5.1.3 状态图 5.1.4 扩充机制 5.2 需求分析的过程模型 5.3 需求优先级分析 5.3.1 确定需求项优先级 5.3.2 排定用例分析的优先顺序 5.4 用例分析 5.4.1 精化领域概念模型 5.4.2 设置分析类 5.4.3 构思分析类之间…...
解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变
一、ConfigMap & Secret 核心定位 属于Kubernetes的配置管理特性,用于解耦应用与配置 1. ConfigMap 作用:存储非敏感配置数据 存储内容: 环境变量命令行参数配置文件(如JSON/XML/YAML)系统参数(如J…...

阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!
阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”! 面对全球化业务拓展对网络连接的严苛要求,阿里云国际版香港轻量云服务器正成为出海企业和开发者的新宠。其核心优势在于搭载了CN2 GIA(Glob…...

Qt6无法识别OpenCV(Windows端开发)
这段时间在Windows 10上进行Qt6的开发。结果在build过程中,出现了如下错误: 但实际上,我明明安装了OpenCV4.10.0, 并且也在CMakeLists.txt中加入了相关内容。 但是,注意自己的编译输出: [1/5 1.4/sec] Automatic MOC and UIC for target R…...

二、网络安全常见编码及算法-(2)
该文章主要介绍古典密码和隐写常用的密码和编码,日常中很少见,主要用于ctf比赛和考试学习一、古典密码 1、古典密码概念概述 古典密码是密码学发展早期所使用的一系列加密技术,这些密码主要依靠手工操作或简单的机械装置来实现信息的加密和…...

Windows系统安装MySQL Connector 使用C++ VS2022连接MySQL
1. 官网及版本 1.1. 网址 官方文档 - 安装编译构建: https://dev.mysql.com/doc/connector-cpp/9.3/en/ 官方文档 - 使用案例: https://dev.mysql.com/doc/dev/connector-cpp/latest/ 下载地址: https://dev.mysql.com/downloads/connector/…...

D2000平台上Centos使用mmap函数遇到的陷阱
----------原创不易,欢迎点赞收藏。广交嵌入式开发的朋友,讨论技术和产品------------- 在飞腾D2000平台上,安装了麒麟linux系统,我写了个GPIO点灯的程序,在应用层利用mmap函数将内核空间映射到用户态,然后…...

Elasticsearch索引机制与Lucene段合并策略深度解析
引言 在现代分布式搜索引擎Elasticsearch中,文档的索引、更新和删除操作不仅是用户交互的核心入口,更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开: 文档生命周期管理:从客户端请求路由到分片定位,从内存…...
BPE、WordPiece 与 Unigram:三种主流子词分词算法对比
BPE、WordPiece 与 Unigram:三种主流子词分词算法对比 在构建现代自然语言处理模型时,Tokenizer 是连接文本与模型之间的桥梁。而在 tokenizer 的设计中,BPE(Byte Pair Encoding)、WordPiece 和 Unigram 三种子词&…...
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程 一、可视化编程1. 降低学习门槛2. 提高学习兴趣3. 便于学习和掌握4. 为后续学习打下基础5. 适合不同年龄段和背景的初学者6. 适合初学者的可视化编程工具 二、可视化编程适合初学者1. 降低学习门槛2. 提高学习兴趣3…...
AI时代新词-AI驱动的自动化(AI - Driven Automation)
一、什么是AI驱动的自动化? AI驱动的自动化(AI - Driven Automation)是指利用人工智能技术实现各种流程和任务的自动化。这种自动化不仅包括简单的重复性任务,还涵盖了复杂的决策和优化任务。AI驱动的自动化通过机器学习、深度学…...

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法
Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …...
Starrocks 物化视图的实现以及在刷新期间能否读数据
背景 本司在用Starrocks做一些业务上的分析的时候,用到了物化视图,并且在高QPS的情况下,RT也没有很大的波动,所以在此研究一下Starrock的实现,以及在刷新的时候是不是原子性的 本文基于Starrocks 3.3.5 结论 Starro…...
前后端传输 Long 类型数据时(时间戳,雪花算法ID),精度丢失的根本原因
前后端传输 Long 类型数据时,精度丢失的根本原因是 JavaScript 的 Number 类型无法精确表示超过 53 位(64 位双精度浮点数)的整数,而 Java 的 Long 类型是 64 位整数。当后端返回的 Long 值超过 2^53-1(即 90071992547…...
探索容器技术:Docker与Kubernetes的实践指南
随着云计算和微服务架构的兴起,容器技术已经成为软件开发和部署的新标准。容器技术以其轻量级、可移植性和灵活性等特点,为应用程序的快速部署、扩展和管理提供了强大的支持。在众多容器技术中,Docker和Kubernetes无疑是最受欢迎的两种。本文…...

Ubuntu从0到1搭建监控平台:本地部署到公网访问实战教程Cpolar穿透与Docker部署全过程
文章目录 前言1.关于Ward2.Docker部署3.简单使用ward4.安装cpolar内网穿透5. 配置ward公网地址6. 配置固定公网地址总结 前言 IT运维人员是否常为服务器管理系统的复杂操作所困扰?当海量性能指标图表与密集预警信号同时涌现时,这种信息过载往往让专业团…...

vscode java debug terminal 中文乱码
现象 解决 快捷键 ctrl , 进入setting 配文件添加 "terminal.integrated.automationProfile.windows": {"path": "cmd","args": ["/k","chcp","65001"]}terminal 启动时,活动也改为 utf-…...

3D PDF如何制作?SOLIDWORKS MBD模板定制技巧
SOLIDWORKS制作3D PDF模版 SOLIDWORKS MBD能够帮助工程师以清晰直观的方式描述产品尺寸信息。在3D PDF文件中,用户可以自由旋转和移动视图,方便查看模型的各个尺寸细节。 本文将带您一步步学习如何使用SOLIDWORKS MBD制作专业的3D PDF模板,…...

Qt DateTimeEdit(时间⽇期的微调框)
使⽤ QDateEdit 作为⽇期的微调框. 使⽤ QTimeEdit 作为时间的微调框 使⽤ QDateTimeEdit 作为时间⽇期的微调框. 这⼏个控件⽤法⾮常相似, 我们以 QDateTimeEdit 为例进⾏介绍. QDateTimeEdit 核⼼属性 属性说明dateTime时间⽇期的值. 形如 2000/1/1 0:00:00date单纯⽇期…...

C# 类和继承(屏蔽基类的成员)
屏蔽基类的成员 虽然派生类不能删除它继承的任何成员,但可以用与基类成员名称相同的成员来屏蔽(mask) 基类成员。这是继承的主要功能之一,非常实用。 例如,我们要继承包含某个特殊方法的基类。该方法虽然适合声明它的…...
基于qt5和stk10开发的互联调试
基于qt5和stk10开发的互联调试程序 QTSTK_Test_yuanwenjian/CppIncludes/AgAsHpopPlugin.tlb , 110080 QTSTK_Test_yuanwenjian/CppIncludes/agashpopplugin.tlh , 108623 QTSTK_Test_yuanwenjian/CppIncludes/AgAttrAutomation.tlb , 11408 QTSTK_Test_yuanwenjian/CppInclude…...
matlab雷达定位仿真
一、边扫描边跟踪雷达仿真 边扫描边跟踪(BISTAR)雷达仿真是一种实时雷达信号处理的技术,用于模拟雷达系统的操作过程,特别是那些具备连续扫描能力的雷达。它的基本原理和流程可以分为以下几个步骤: (1&…...

基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:饲养员,健康登记,工作进度,动物信息,进食信息,动物健康,动物医治,饲料信息,工作留言 开题报告内容 基于Vue框架的动物园饲养管理系统开题报告 一、研究背景与意义 (一)研究背景 随着城市化进程加快和公众对生…...
MySQL 索引和事务
目录 前言 一、MySQL 索引介绍 1. 索引概述 2. 索引作用 3. 索引的分类 3.1 普通索引 3.2 唯一索引 3.3 主键索引 3.4 组合索引 (最左前缀) 3.5 全文索引 (FULLTEXT) 3.6 创建索引的原则依据 3.7 查看索引 3.8 删除索引 二、MySQL 事务 1. 事务的 ACID 原则 MYS…...