Golang笔记——常用库context和runtime
大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的常用库context和runtime,包括库的基本概念和基本函数的使用等。
文章目录
- context
- `context` 包的基本概念
- 主要类型和函数
- 1. **`Context` 类型**
- 2. **`context.Background()` 和 `context.TODO()`**
- 示例:
- 3. **`context.WithCancel()`**
- 语法:
- 示例:
- 4. **`context.WithTimeout()` 和 `context.WithDeadline()`**
- 语法:
- 示例:
- 5. **`context.WithValue()`**
- 语法:
- 示例:
- 组合使用 `context` 的常见场景
- `context` 与 goroutine
- 示例:goroutine 中使用上下文取消操作
- 总结
- runtime
- 1. `runtime` 包功能概述
- 2. 常用函数和用途
- 2.1 Goroutine 管理
- 2.2 内存管理与垃圾回收
- 2.3 并发控制
- 2.4 调用栈和错误处理
- 2.5 程序环境与操作系统信息
- 2.6 Cgo 和与 C 交互
- 3. `runtime.MemStats` 结构体
- 4. 开发中的常见应用场景
- 4.1 性能监控和调优
- 4.2 内存泄漏排查
- 4.3 多核 CPU 优化
- 4.4 调试与异常处理
- 4.5 跨平台开发
- 5. 总结
- 历史文章
- MySQL数据库
- Redis
- Golang
context
Go 语言中的 context
包是一个用于处理跨 API 边界、跨多个 goroutine 的请求上下文的标准库。它提供了一种传递上下文信息、取消信号和超时机制的方式,特别适用于并发程序设计中。在 Go 中,context
主要用于:
- 取消信号传递:在多个 goroutine 中传递取消信号。
- 超时控制:控制操作的超时。
- 传递请求范围的数据:将请求级别的数据(如请求 ID)传递到不同的 goroutine。
context
包的基本概念
context
的核心概念是通过一个 Context
对象在不同的 goroutine 之间传递数据,取消信号和超时信息。Context
是一个接口,通常用于传递一些可以取消的、具有超时限制的共享数据。
context
包的常见用途包括:
- 在 HTTP 请求处理、数据库查询、RPC 调用中传递上下文。
- 管理 goroutine 生命周期:当主操作需要取消时,通过上下文通知相关 goroutine。
主要类型和函数
1. Context
类型
context.Context
是一个接口,定义了处理上下文的基本方法。它的实现包含了不同的上下文实例,如背景上下文(background
)、请求上下文(WithCancel
、WithTimeout
、WithDeadline
等)。
接口定义:
type Context interface {Deadline() (deadline time.Time, ok bool) // 获取截止时间Done() <-chan struct{} // 获取取消信号Err() error // 返回取消的原因Value(key interface{}) interface{} // 获取与指定 key 相关联的值
}
2. context.Background()
和 context.TODO()
这两个函数是获取根上下文的方式:
context.Background()
:通常作为主程序的起点或者初始化根上下文。它通常用于 main 函数、初始化以及测试中。context.TODO()
:类似于Background()
,但用于代码尚未决定使用何种上下文的地方。通常在代码中预留,用于以后需要添加上下文的地方。
示例:
package mainimport ("context""fmt"
)func main() {// 使用 context.Background()ctx := context.Background()fmt.Println("Background context:", ctx)
}
3. context.WithCancel()
WithCancel
用于创建一个带取消功能的子上下文。当调用父上下文的取消函数时,子上下文的 Done
通道会接收到信号。
语法:
func WithCancel(parent Context) (ctx Context, cancel func())
parent
:父上下文。ctx
:返回的子上下文。cancel
:调用此函数会取消子上下文。
示例:
package mainimport ("context""fmt""time"
)func main() {// 创建带取消功能的上下文ctx, cancel := context.WithCancel(context.Background())// 模拟在 goroutine 中使用上下文go func() {select {case <-ctx.Done():fmt.Println("Context cancelled")}}()// 取消上下文time.Sleep(2 * time.Second)cancel() // 取消上下文,触发 goroutine 中的 Done 通道
}
4. context.WithTimeout()
和 context.WithDeadline()
WithTimeout
和 WithDeadline
用于创建带有超时和截止时间的上下文。
WithTimeout
:设置超时时间,超时后会自动取消上下文。WithDeadline
:设置具体的截止时间,超出截止时间后会自动取消上下文。
语法:
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
WithTimeout
使用相对时间,指定超时的时长。WithDeadline
使用绝对时间,指定具体的截止时间。
示例:
package mainimport ("context""fmt""time"
)func main() {// 使用 WithTimeout 设置超时ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)defer cancel()// 模拟处理任务select {case <-time.After(2 * time.Second):fmt.Println("Task completed")case <-ctx.Done():fmt.Println("Context cancelled:", ctx.Err())}
}
在这个示例中,任务会在超时 3 秒后自动取消,如果 time.After
中的延迟超过了超时时间,ctx.Done()
将会接收到取消信号。
5. context.WithValue()
WithValue
用于将特定的数据与上下文关联。可以在上下文中存储键值对,以便跨 goroutine 传递数据。
语法:
func WithValue(parent Context, key, val interface{}) Context
key
和val
是用户定义的键值对,可以在之后的代码中通过context.Value()
获取。
示例:
package mainimport ("context""fmt"
)func main() {// 创建上下文并设置键值对ctx := context.WithValue(context.Background(), "userID", 12345)// 从上下文中获取值userID := ctx.Value("userID")fmt.Println("UserID:", userID)
}
这里的 WithValue
可以用于传递诸如请求 ID、用户信息等上下文数据。
组合使用 context
的常见场景
-
处理请求超时:在 HTTP 请求处理中,可以使用
WithTimeout
或WithDeadline
来限制请求的最长处理时间,防止请求挂起太长时间。 -
取消信号传递:可以通过
WithCancel
来创建一个带取消功能的上下文,将取消信号传递给多个 goroutine,确保在操作超时或取消时,所有相关的 goroutine 都能够及时退出。 -
在多个 goroutine 中传递共享数据:使用
WithValue
在上下文中传递请求级别的数据(如请求 ID、用户认证信息等),从而可以在多个 goroutine 中共享这些数据。
context
与 goroutine
context
在并发编程中尤其重要。当你启动一个 goroutine 时,可以传递一个上下文,允许在执行过程中传递取消信号或超时信号。通过上下文,你可以确保在程序需要取消某个操作时,能够优雅地停止相关的 goroutine。
示例:goroutine 中使用上下文取消操作
package mainimport ("context""fmt""time"
)func doWork(ctx context.Context) {select {case <-time.After(5 * time.Second):fmt.Println("Work completed")case <-ctx.Done():fmt.Println("Work canceled:", ctx.Err())}
}func main() {// 创建一个 2 秒超时的上下文ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel()// 启动 goroutine 执行任务go doWork(ctx)// 等待 goroutine 完成time.Sleep(3 * time.Second)
}
在这个例子中,doWork
函数中的 goroutine 会在超时后被取消,ctx.Done()
会接收到取消信号,停止工作。
总结
context
包是 Go 语言中用于处理并发操作和跨 goroutine 传递信息的重要工具。- 通过上下文,可以传递取消信号、超时控制、以及请求范围的数据。
- 常用函数包括
WithCancel
、WithTimeout
、WithDeadline
和WithValue
。 context
包的设计帮助开发者在并发场景中管理 goroutine 生命周期,尤其在网络请求、数据库操作等中具有重要作用。
通过合理使用 context
,你可以在并发编程中更好地管理 goroutine、取消操作以及控制超时,确保程序的健壮性。
runtime
runtime
包是 Go 语言的一个核心库,它提供了与 Go 运行时系统交互的接口,包括并发调度、内存管理、垃圾回收、调用栈信息、程序环境信息等。开发中,runtime
包非常有用,特别是在调试、性能调优、并发控制等场景下。
在实际开发中,通常使用 runtime
包来:
- 获取内存使用统计信息,了解内存分配、垃圾回收情况。
- 调试时获取 goroutine 调度信息,帮助定位性能瓶颈。
- 管理并发,通过
GOMAXPROCS
调整使用的 CPU 核心数。 - 跨平台开发,根据操作系统和架构类型进行条件编译。
- 控制程序退出,通过
Goexit()
或调度器管理 goroutine。
下面是更加详细的介绍:
1. runtime
包功能概述
runtime
包包含对 Go 语言运行时系统的控制。Go 程序的运行时系统负责管理协程(goroutines)、垃圾回收(GC)、内存分配、调度等任务。runtime
包提供的函数和类型使得开发者能够在运行时获取程序的状态、控制并发、监控内存使用等。
2. 常用函数和用途
2.1 Goroutine 管理
Go 使用 goroutine 来实现轻量级的并发。在开发中,我们通常需要获取 goroutine 的状态,或者控制并发的数量。
-
Goexit:强制终止当前 goroutine。用在程序错误或需要提前退出的场景。
runtime.Goexit() // 终止当前 goroutine,其他 goroutines 不受影响
这在协程出错或执行某个任务完成时尤其有用。
-
NumGoroutine:获取当前正在执行的 goroutine 数量。
num := runtime.NumGoroutine() fmt.Println(num) // 输出当前运行的 goroutine 数量
在高并发应用中,使用
NumGoroutine
来检查当前系统的负载(即 goroutines 数量),特别是在对性能进行调优时非常有用。
2.2 内存管理与垃圾回收
Go 使用垃圾回收(GC)机制自动管理内存分配和回收。runtime
包可以提供关于内存使用的详细信息。
-
MemStats:获取内存统计信息。通过这个函数,你可以了解内存的分配情况,例如已分配内存、GC 使用的内存等。
var m runtime.MemStats runtime.ReadMemStats(&m)fmt.Println("Alloc:", m.Alloc) // 当前堆内存使用量 fmt.Println("TotalAlloc:", m.TotalAlloc) // 程序总共分配的内存量 fmt.Println("HeapAlloc:", m.HeapAlloc) // 堆内存分配的量 fmt.Println("HeapSys:", m.HeapSys) // 堆内存系统分配的量 fmt.Println("NumGC:", m.NumGC) // 垃圾回收次数
开发中,如果需要跟踪程序的内存使用情况或进行内存泄漏排查,可以使用这个函数来了解内存的分配和回收情况。
-
GC:强制触发垃圾回收。一般情况下,Go 的垃圾回收是自动触发的,但是有时我们可能需要手动触发垃圾回收,来进行性能测试或控制内存回收的时机。
runtime.GC() // 强制执行垃圾回收
通常,Go 的 GC 是在程序空闲时自动执行,但在性能敏感的应用中,开发者可以使用
runtime.GC()
来控制垃圾回收的时机。
2.3 并发控制
Go 中的并发是通过 goroutine 和调度器来管理的,runtime
包提供了控制并发和获取调度信息的接口。
-
GOMAXPROCS:设置 Go 程序使用的最大 CPU 核心数。默认情况下,Go 程序会使用系统所有的 CPU 核心,使用
GOMAXPROCS
可以手动设置。runtime.GOMAXPROCS(4) // 设置最大 CPU 核心数为 4
这对于程序的并发性能调优很有帮助,尤其是在 CPU 密集型任务中。
2.4 调用栈和错误处理
-
Caller:获取调用栈的信息。
runtime.Caller()
函数可以帮助我们获取当前函数的调用栈信息。通常用于调试和错误日志中。pc, file, line, ok := runtime.Caller(0) fmt.Printf("PC: %v, File: %v, Line: %v, OK: %v\n", pc, file, line, ok)
Caller(0)
返回当前函数的调用信息,Caller(1)
返回上一层函数的信息,依此类推。 -
Stack:获取当前 goroutine 的调用栈。通常用于调试和排查程序崩溃的问题。
buf := make([]byte, 1024) n := runtime.Stack(buf, false) fmt.Println(string(buf[:n]))
Stack
方法可以打印当前 goroutine 的调用栈,帮助开发者排查程序在运行时的异常。
2.5 程序环境与操作系统信息
-
GOARCH:获取当前操作系统架构(如
amd64
、arm
)。fmt.Println(runtime.GOARCH) // 输出:amd64
-
GOOS:获取当前操作系统类型(如
linux
、windows
、darwin
等)。fmt.Println(runtime.GOOS) // 输出:linux
这些信息对于编写跨平台的应用非常有用,尤其是在需要根据平台做不同处理时。
2.6 Cgo 和与 C 交互
Go 语言通过 cgo
与 C 代码进行交互,runtime
包也提供了相关的接口。
- CgoCall:该函数用于处理 C 语言和 Go 语言之间的调用,虽然在实际开发中不常用,但对于编写需要与 C 库交互的代码时,
runtime
包是必不可少的。
3. runtime.MemStats
结构体
runtime.MemStats
是 Go 语言用于描述内存使用的结构体,常用字段有:
- Alloc:当前分配的堆内存字节数。
- TotalAlloc:程序运行过程中总共分配的内存字节数。
- HeapAlloc:当前堆内存分配的字节数。
- HeapSys:堆内存分配给 Go 程序的总字节数。
- HeapIdle:当前堆内存中未使用的字节数。
- NumGC:垃圾回收的次数。
- PauseTotalNs:所有垃圾回收的总暂停时间。
通过 runtime.ReadMemStats
函数可以获取这些内存统计信息,帮助开发者分析程序的内存使用情况,进行内存优化。
4. 开发中的常见应用场景
4.1 性能监控和调优
在高并发或资源密集型应用中,开发者常常需要监控 CPU 和内存的使用情况,以便进行性能调优。例如,可以通过 runtime.NumGoroutine()
监控 goroutine 的数量,使用 runtime.ReadMemStats()
监控内存使用情况。
4.2 内存泄漏排查
通过 runtime.MemStats
,开发者可以查看程序的内存分配和垃圾回收情况。如果程序的内存占用不断上升,可能是内存泄漏的表现。通过 runtime.GC()
和 runtime.ReadMemStats()
,可以帮助发现内存泄漏并进行优化。
4.3 多核 CPU 优化
在多核机器上,Go 默认会利用多个 CPU 核心来并行执行程序。通过设置 runtime.GOMAXPROCS()
,开发者可以控制使用的最大 CPU 核心数,进行并发优化。
4.4 调试与异常处理
runtime.Stack()
和 runtime.Caller()
在调试时非常有用,帮助开发者捕获栈信息并定位错误。开发者可以在错误发生时打印调用栈信息,便于分析和修复问题。
4.5 跨平台开发
使用 runtime.GOARCH
和 runtime.GOOS
,可以根据不同的操作系统和架构编写不同的代码,适配不同的运行环境。
5. 总结
runtime
包是 Go 语言中非常重要
的一个工具库,提供了与 Go 运行时系统交互的各种接口。开发中,runtime
包广泛应用于性能调优、并发管理、内存监控、跨平台开发等领域。掌握 runtime
包的使用,能够帮助开发者更好地理解 Go 语言的执行机制,并对程序进行高效调试和优化。
历史文章
MySQL数据库
MySQL数据库
Redis
Redis数据库笔记合集
Golang
- Golang笔记——语言基础知识
- Golang笔记——切片与数组
- Golang笔记——hashmap
- Golang笔记——rune和byte
- Golang笔记——channel
- Golang笔记——Interface类型
- Golang笔记——数组、Slice、Map、Channel的并发安全性
- Golang笔记——协程同步
- Golang笔记——并发控制
- Golang笔记——GPM调度器
- Golang笔记—— new() 、 make() 和简短声明符
- Golang笔记—— error 和 panic
- Golang——内存(内存管理、内存逃逸、垃圾回收 (GC) 机制)
- Golang笔记——包的循环引用问题(import cycle not allowed)和匿名导入
- Golang笔记——常用库sync
相关文章:

Golang笔记——常用库context和runtime
大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的常用库context和runtime,包括库的基本概念和基本函数的使用等。 文章目录 contextcontext 包的基本概念主要类型和函数1. **…...

2000-2020年各省第二产业增加值占GDP比重数据
2000-2020年各省第二产业增加值占GDP比重数据 1、时间:2000-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围:31省 5、指标解释:第二产业增加值占GDP比重…...

unity商店插件A* Pathfinding Project如何判断一个点是否在导航网格上?
需要使用NavGraph.IsPointOnNavmesh(Vector3 point) 如果点位于导航网的可步行部分,则为真。 如果一个点在可步行导航网表面之上或之下,在任何距离,如果它不在更近的不可步行节点之上 / 之下,则认为它在导航网上。 使用方法 Ast…...

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?
文章目录 13003数据结构与算法全书框架考试题型的分值分布如何? 本次内容概述绪论第一节概览什么是数据、数据元素,数据项,数据项的值?什么是数据结构?分哪两种集合形式(逻辑和存储)?…...

富文本 tinyMCE Vue2 组件使用简易教程
参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…...

强化学习在自动驾驶中的实现与挑战
强化学习在自动驾驶中的实现与挑战 自动驾驶技术作为当今人工智能领域的前沿之一,正通过各种方式改变我们的出行方式。而强化学习(Reinforcement Learning, RL),作为机器学习的一大分支,在自动驾驶的实现中扮演了至关重要的角色。它通过模仿人类驾驶员的决策过程,为车辆…...

记录 | MaxKB创建本地AI智能问答系统
目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…...

特种作业操作之低压电工考试真题
1.下面( )属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案:C 2.事故照明一般采用( )。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案:B 3.人体同时接触带电设备或线路中的两相导体时,电流从一相通过人体流…...

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…...

Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程
一、问题描述 在使用 Maven 管理项目依赖时,遇到了一个棘手的问题。具体表现为:在 pom.xml 文件中导入了所需的依赖,并且在 IDE 中导入语句没有显示为红色(表示 IDE 没有提示依赖缺失),但是在实际使用这些依…...

我们需要有哪些知识体系,知识体系里面要有什么哪些内容?
01、管理知识体系的学习知识体系 主要内容: 1、知识管理框架的外部借鉴、和自身知识体系的搭建; 2、学习能力、思维逻辑能力等的塑造; 3、知识管理工具的使用; 4、学习资料的导入和查找资料的渠道; 5、深层关键的…...

什么是vue.js组件开发,我们需要做哪些准备工作?
Vue.js 是一个非常流行的前端框架,用于构建用户界面。组件开发是 Vue.js 的核心概念之一,通过将界面拆分为独立的组件,可以提高代码的可维护性和复用性。以下是一个详细的 Vue.js 组件开发指南,包括基础概念、开发流程和代码示例。 一、Vue.js 组件开发基础 1. 组件的基本…...

网络工程师 (3)指令系统基础
一、寻址方式 (一)指令寻址 顺序寻址:通过程序计数器(PC)加1,自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。跳…...

第4章 神经网络【1】——损失函数
4.1.从数据中学习 实际的神经网络中,参数的数量成千上万,因此,需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量,特征量指的是从输入数据/图像中提取出的本质的数 …...

【Python】第五弹---深入理解函数:从基础到进阶的全面解析
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、函数 1.1、函数是什么 1.2、语法格式 1.3、函数参数 1.4、函数返回值 1.5、变量作用域 1.6、函数…...

【MQ】如何保证消息队列的高性能?
零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO࿰…...

RAG是否被取代(缓存增强生成-CAG)吗?
引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…...

用C++编写一个2048的小游戏
以下是一个简单的2048游戏的实现。这个实现使用了控制台输入和输出,适合在终端或命令行环境中运行。 2048游戏的实现 1.游戏逻辑 2048游戏的核心逻辑包括: • 初始化一个4x4的网格。 • 随机生成2或4。 • 处理玩家的移动操作(上、下、左、…...

为何SAP S4系统中要设置MRP区域?MD04中可否同时显示工厂级、库存地点级的数据?
【SAP系统PP模块研究】 一、物料主数据的MRP区域设置 SAP ECC系统中想要指定不影响MRP运算的库存地点,是针对库存地点设置MRP标识,路径为:SPRO->生产->物料需求计划->计划->定义每一个工厂的存储地点MRP,如下图所示: 另外,在给物料主数据MMSC扩充库存地点时…...

Windows10官方系统下载与安装保姆级教程【U盘-官方ISO直装】
Windows 10 官方系统安装/重装 制作启动盘的U盘微软官网下载Win10安装包创建启动盘U盘 安装Win10 本文采用U盘安装Windows10官方系统。 制作启动盘的U盘 微软官网下载Win10安装包 微软官网下载Win10安装包链接:https://www.microsoft.com/zh-cn/software-downloa…...

第05章 07 切片图等值线代码一则
绘制脑部切面图的阈值等值线是一个常见的任务,通常涉及使用VTK(Visualization Toolkit)库来处理医学图像数据。以下是一个基于VTK/C的示例代码,展示如何读取脑部DICOM图像数据,应用阈值过滤器来提取特定组织的等值线&a…...

【深度学习】线性回归的简洁实现
线性回归的简洁实现 在过去的几年里,出于对深度学习强烈的兴趣,许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 目前,我们只会运用: (1)通…...

渗透测试技法之口令安全
一、口令安全威胁 口令泄露途径 代码与文件存储不当:在软件开发和系统维护过程中,开发者可能会将口令以明文形式存储在代码文件、配置文件或注释中。例如,在开源代码托管平台 GitHub 上,一些开发者由于疏忽,将包含数据…...

【R语言】数学运算
一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…...

小游戏源码开发搭建技术栈和服务器配置流程
近些年各种场景小游戏开发搭建版本层出不穷,山东布谷科技拥有多年海内外小游戏源码开发经验,现为从事小游戏源码开发或游戏运营的朋友们详细介绍小游戏开发及服务器配置流程。 一、可以对接到app的小游戏是如何开发的 1、小游戏源码开发的需求分析: 明…...

深度学习|表示学习|卷积神经网络|输出维度公式|15
如是我闻: 在卷积和池化操作中,计算输出维度的公式是关键,它们分别可以帮助我们计算卷积操作和池化操作后的输出大小。下面分别总结公式,并结合解释它们的意义: 1. 卷积操作的输出维度公式 当我们对输入图像进行卷积时…...

cpp智能指针
普通指针的不足 new和new[]的内存需要用delete和deletel]释放。 程序员的主观失误,忘了或漏了释放。 程序员也不确定何时释放。 普通指针的释放 类内的指针,在析构函数中释放。 C内置数据类型,如何释放? new出来的类,本身如…...

【面试题】 Java 三年工作经验(2025)
问题列表 为什么选择 spring boot 框架,它与 Spring 有什么区别?spring mvc 的执行流程是什么?如何实现 spring 的 IOC 过程,会用到什么技术?spring boot 的自动化配置的原理是什么?如何理解 spring boot 中…...

MOS的体二极管能通多大电流
第一个问题:MOS导通之后电流方向可以使任意的,既可以从D到S,也可以从S到D。 第二个问题:MOS里面的体二极管电流可以达到几百安培,这也就解释了MOS选型的时候很少考虑体二极管的最大电流,而是考虑DS之间电流…...

Node.js下载安装及环境配置教程 (详细版)
Node.js:是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型,使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序࿰…...