5.28 后端面经

news2025/6/1 0:11:23

为什么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 main

import "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 main

import "fmt"

// Goods 构建的对象
type Goods struct {
	Name  string
	Price float64
	Count int
}

// GoodsBuilder 构建器
type GoodsBuilder interface {
	SetName(name string) GoodsBuilder
	SetPrice(price float64) GoodsBuilder
	SetCount(count int) GoodsBuilder
	Build() *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 = name
	return g
}

func (g ConcreteBuilder) SetPrice(price float64) GoodsBuilder {
	g.goods.Price = price
	return g
}

func (g ConcreteBuilder) SetCount(count int) GoodsBuilder {
	g.goods.Count = count
	return 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 main

import (
	"fmt"
	"sync"
)

// 懒汉式:用到才加载【饿汉式:直接放在init方法里,程序一启动就创建好】
var (
	instance *Singleton
	once     = sync.Once{}
)

type Singleton struct {
}

func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})
	return instance
}

func main() {
	one := GetInstance()
	two := GetInstance()
	//one=0x100f54088
	//two=0x100f54088
	fmt.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.coloradmin.cn/o/2392168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CPP中CAS std::chrono 信号量与Any类的手动实现

前言 CAS&#xff08;Compare and Swap&#xff09; 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数&#xff1a;内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时&#xff0c;CAS才会将内存位…

PHP生成pdf方法

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

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 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网关助力改造电厂改造升级

发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电&#xff0c;您都需要提高运营效率&#xff0c;并在资产老化、资源萎缩的情况下&#xff0c;紧跟不断变化的法规。如今&#xff0c;智能系统和技术能够帮助您实现运营转型&#xff0c;提高可视性并实现关键流程自动…

《软件工程》第 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 构思分析类之间…

阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!

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

Qt6无法识别OpenCV(Windows端开发)

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

二、网络安全常见编码及算法-(2)

该文章主要介绍古典密码和隐写常用的密码和编码&#xff0c;日常中很少见&#xff0c;主要用于ctf比赛和考试学习一、古典密码 1、古典密码概念概述 古典密码是密码学发展早期所使用的一系列加密技术&#xff0c;这些密码主要依靠手工操作或简单的机械装置来实现信息的加密和…

Windows系统安装MySQL Connector 使用C++ VS2022连接MySQL

1. 官网及版本 1.1. 网址 官方文档 - 安装编译构建&#xff1a; https://dev.mysql.com/doc/connector-cpp/9.3/en/ 官方文档 - 使用案例&#xff1a; https://dev.mysql.com/doc/dev/connector-cpp/latest/ 下载地址&#xff1a; https://dev.mysql.com/downloads/connector/…

D2000平台上Centos使用mmap函数遇到的陷阱

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

Elasticsearch索引机制与Lucene段合并策略深度解析

引言 在现代分布式搜索引擎Elasticsearch中&#xff0c;文档的索引、更新和删除操作不仅是用户交互的核心入口&#xff0c;更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开&#xff1a; 文档生命周期管理&#xff1a;从客户端请求路由到分片定位&#xff0c;从内存…

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法

Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …

Ubuntu从0到1搭建监控平台:本地部署到公网访问实战教程Cpolar穿透与Docker部署全过程

文章目录 前言1.关于Ward2.Docker部署3.简单使用ward4.安装cpolar内网穿透5. 配置ward公网地址6. 配置固定公网地址总结 前言 IT运维人员是否常为服务器管理系统的复杂操作所困扰&#xff1f;当海量性能指标图表与密集预警信号同时涌现时&#xff0c;这种信息过载往往让专业团…

vscode java debug terminal 中文乱码

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

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

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

Qt DateTimeEdit(时间⽇期的微调框)

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

C# 类和继承(屏蔽基类的成员)

屏蔽基类的成员 虽然派生类不能删除它继承的任何成员&#xff0c;但可以用与基类成员名称相同的成员来屏蔽&#xff08;mask&#xff09; 基类成员。这是继承的主要功能之一&#xff0c;非常实用。 例如&#xff0c;我们要继承包含某个特殊方法的基类。该方法虽然适合声明它的…

基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;饲养员,健康登记,工作进度,动物信息,进食信息,动物健康,动物医治,饲料信息,工作留言 开题报告内容 基于Vue框架的动物园饲养管理系统开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着城市化进程加快和公众对生…

WPS自动换行

换行前 换行后 快捷键 第一步&#xff1a;启用「自动换行」功能 选中目标单元格/区域&#xff1a;点击需要设置的单元格&#xff08;或拖动选中多个单元格&#xff09;。开启自动换行&#xff08;3种方式任选&#xff09;&#xff1a; 快捷按钮&#xff1a;在顶部菜单栏点击「…