编程语言

Go、Python 等语言实践与实现记录。

专题分组

下级分类

2 个下级
Python 开发
29 分钟

谷歌tts流式生成

这篇笔记围绕 Google Cloud Text-to-Speech 的流式音频生成实现展开,重点处理中文 TTS 暂不支持原生 streaming_synthesize 的现实限制。内容先给出一种“伪流式”方案:通过 synthesize_speech 一次性拿到完整 MP3 音频,再按 1KB 等固定大小切分,用异步文件写入、yield 分片和短暂 sleep 模拟持续下发,使调用方可以边接收边播放、上传或统计,但首包仍要等服务端完成整段合成。随后演示原生流式接口的调用方式,包括选择 en-US-Chirp3-HD-Charon 声线、先发送 streaming_config、再发送文本输入,并遍历 responses 中的 audio_content 分片实现边合成边消费。文章明确指出当前原生流式仅适用于英文 Chirp 3 HD 系列,中文和其他声线需要回退到伪流式或普通合成接口。编码部分比较了非流式与流式接口的差异:前者可用 MP3、LINEAR16、OGG_OPUS 等格式,后者只支持 OGG_OPUS 和 LINEAR16,请求 MP3 会报不支持。最后从延迟、带宽和兼容性解释 PCM 与 OGG/Opus 的取舍,适合正在为 AI 语音播报、Web 播放、对象存储上传或实时语音链路选择 Google TTS 接入方式的后端和应用开发者。

Go 开发
9 分钟

go channel用法

这篇笔记围绕 Go 的 channel 基础用法展开,定位为 goroutine 之间传递数据的类型安全管道,并借 CSP 思想说明为什么 Go 鼓励用通信来协调并发,而不是让多个 goroutine 直接共享同一份内存。内容重点解释 channel 的类型化、同步阻塞、可选缓冲区和 close 后接收零值及状态标志等特性,并给出任务分发、信号通知、并发控制等常见使用场景。文章用 go func() 发送字符串的例子说明无缓冲通道的核心约束:发送和接收必须并发配对,若在同一个顺序执行流中先发送再接收,程序会停在发送语句并形成死锁。随后通过 make(chan string) 与 make(chan string, 1) 的对比,区分无缓冲通道“零容量、必须当场交付”和缓冲通道“容量未满即可暂存”的行为差异,也说明并非所有 channel 操作都必须额外启动 goroutine。最后,笔记把普通 int 变量和 chan int 放在并发语境下比较,强调变量只是存值,而 channel 用于跨 goroutine 传值、同步生产者与消费者,并减少手写锁和时序控制的复杂度,适合刚开始理解 Go 并发模型和阻塞语义的读者。

Go 开发
7 分钟

go 里面的指针

这篇笔记围绕 Go 语言中的指针基础展开,先用 `a := 10`、`p := &a` 和 `*p` 说明指针就是变量的内存地址,`&` 用于取地址,`*` 用于通过地址访问或修改值。内容重点澄清 Go 与 C 在指针上的差异:Go 可以声明 `*int` 这类指针类型,但不支持指针算术,不能随意转换指针类型,复杂的多级指针也不鼓励使用,内存分配由 `new`、`make` 和 GC 机制配合完成。文章通过 `modify(x *int)` 的例子解释函数修改外部变量的过程:传入的是 `&a` 这个地址值,函数参数仍然按值接收,只是可以通过解引用修改地址指向的原始数据。结构体指针部分展示了 `p.Name` 与 `(*p).Name` 的等价关系,说明 Go 会在访问结构体字段时自动解引用,以减少样板代码。笔记还提醒切片、map、channel 等内置类型本身具有引用语义,通常不需要再显式传指针。最后,它集中纠正了“Go 是引用传递”“new 和 make 一样”“指针越多越高效”等常见误区,适合正在从 C、JavaScript 或其他语言迁移到 Go、需要理解值传递与可变性控制的初学者。

Go 开发
10 分钟

gorm配置数据库

这份笔记面向 Go Web 项目中使用 GORM 接入数据库的基础配置场景,以 PostgreSQL 为例展示了将连接初始化放在 infra 目录下的组织方式。正文先概括 GORM 作为 ORM 的常见能力,包括多数据库支持、自动迁移、事务、预加载、钩子、软删除和自定义 SQL,并给出安装 gorm 与数据库驱动的命令。配置部分围绕 InitPG 展开:从 utils.AppConfig 读取主机、用户、密码、库名和端口拼接 DSN,按开发环境开启 SQL Info 日志、生产环境静默日志,再通过 gorm.Open 建立连接并取得底层 sql.DB 设置连接池参数。文章还说明 main.go 中应在加载配置后调用 infra.InitPG,并用 defer infra.ClosePG 在应用退出时关闭连接,便于服务优雅释放资源。关于 GetDB,重点澄清它只是返回全局保存的 *gorm.DB 指针,不会重复建连,也不会负责释放连接;多个请求并发调用是安全的,因为 GORM 的实例本身并不长期持有物理连接。真正执行 Find、First 等查询时,GORM 会从连接池临时借用连接并在完成后归还,但使用 Raw().Rows() 这类手动遍历结果集的写法必须显式 Close,否则可能持续占用连接池。整体适合正在搭建 Gin/GORM 项目骨架、需要理解连接池生命周期和全局 DB 访问方式的后端开发者。

Go 开发
8 分钟

docker部署 gin

这篇笔记聚焦 Gin 项目的 Docker 容器化部署,先从 Go 的部署特性解释为什么它适合做轻量镜像:Go 通过 go build 将源码、标准库和依赖静态链接为操作系统可直接执行的原生二进制文件,通常不需要在运行环境安装 Go、解释器或虚拟机。文章用 ELF、Mach-O、PE 等可执行文件格式说明二进制产物的本质,并对比 Go 与 C/C++ 在默认静态链接、交叉编译、标准库、并发和内存安全方面的差异,帮助读者理解“只拷贝可执行文件即可运行”的前提。部署部分给出多阶段 Dockerfile:先使用 golang:alpine 下载依赖并执行 go build -o gin-api-template,再切换到 alpine:latest,仅安装 ca-certificates,复制编译产物和 .env,暴露 8080 端口并以 CMD 启动程序。文章还解释 Alpine 镜像体积小、攻击面低、启动快以及基于 musl libc 和 busybox 的特点,说明为什么它常用于 Go 服务的运行阶段。最后的 docker-compose.yml 展示了构建当前目录镜像、映射 8080:8080、挂载并加载 .env、设置 unless-stopped 重启策略的基本方式,适合需要把 Gin API 打包成较小容器镜像并保持配置文件可管理的后端开发者。

Go 开发
16 分钟

gin 常见中间件配置

这篇笔记围绕 Gin API 项目的中间件基础配置展开,按 middlewares 目录下的 security.go、cors.go、request_id.go 和 logging.go 拆分说明安全响应头、跨域、请求标识与请求响应日志的实现方式。安全头部分展示了在 gin.HandlerFunc 中统一设置 X-Frame-Options、Content-Security-Policy、Referrer-Policy、Cross-Origin-Opener-Policy、X-Content-Type-Options、X-XSS-Protection,并仅在 HTTPS 或代理标记为 https 时启用 HSTS,用于降低 iframe 劫持、Referer 泄露和 MIME 嗅探等风险。CORS 配置通过应用配置读取允许来源,在开发环境回退到 localhost 与 127.0.0.1 白名单,同时明确允许方法、请求头、暴露 X-Request-ID、携带凭证和预检缓存时间。Request ID 中间件会优先复用请求头中的 X-Request-ID,没有则生成 UUID,并写入 Gin Context、工具包上下文和响应头,方便日志检索、链路追踪和前后端协同排查。日志中间件演示了读取并回填请求体、包装 ResponseWriter 捕获响应体、记录方法、路径、客户端 IP、User-Agent、状态码和耗时的做法。最后在 gin.New() 初始化的路由中给出注册顺序:Recovery、安全头、CORS、Request ID、日志,再挂载业务路由,适合作为 gin-api-template 的落地参考;但请求体和响应体日志会带来敏感信息暴露与性能开销,实际项目需要按场景裁剪。

Go 开发
11 分钟

gin框架-使用

这篇笔记围绕 Gin 框架的入门使用与并发模型展开,先定位它作为 Go 生态中轻量、高性能 Web 框架的用途,适合 RESTful API、微服务接口网关、后台管理系统和轻量级后端模块等场景。正文用一个 /ping 路由示例展示 Gin 启动 HTTP 服务、注册 GET 路由并返回 JSON 的最小写法,同时概括其中间件、参数绑定、错误处理、路由分组以及与 Swagger、JWT、Gorm、Zap 等库集成的常见能力。文章还把 Gin 放到容器化和云原生背景下理解,说明 Go 静态编译、二进制文件易分发、镜像可精简、启动快和适配 CI/CD 的特点,为什么与 Docker、Kubernetes 等基础设施生态契合。重点部分解释了 Gin“同步风格编程、goroutine 并发处理请求”的模型:业务代码看起来线性直观,但每个 HTTP 请求通常由独立 goroutine 承载,因此慢接口不会天然阻塞其他请求。最后通过 FastAPI 对比 async/await、事件循环、阻塞 IO、GIL 和协程调度差异,帮助读者判断 Go/Gin 与 Python/FastAPI 在易用性、吞吐和阻塞风险上的取舍。适合正在学习 Go 后端、准备做 API 服务或想理解 Gin 并发机制与容器化部署优势的开发者阅读。

go 环境搭建
Go 开发
9 分钟

go 环境搭建

这是一篇面向 Go 初学者的本地开发环境与项目结构入门笔记,覆盖从安装 Go、配置 GOROOT 与 PATH、验证 go version,到在 GoLand 中选择 SDK 的基础准备。正文重点解释 GOPATH 与 Go Modules 的差异:前者要求项目放在固定的 $GOPATH/src 下,依赖集中管理;后者通过 go.mod 在项目内独立管理依赖,是 Go 1.16 之后默认推荐的方式。文章以 Gin 小项目为例,演示 go mod init 创建模块、go get 显式添加依赖、go mod tidy 根据 import 自动整理依赖,并给出 main 包调用自定义 gin_test 包启动 /ping 接口的代码结构。后半部分补充 Go 的包与文件组织规则,说明同一目录同一 package 下多个 .go 文件会被编译器合并,函数重名会触发 redeclared 编译错误,并与 Python 的动态模块机制做了对照。文章还概括了 Go 用 struct、method、组合和接口替代传统 class 与继承的基本思路。最后介绍 air 热重载工具的安装、PATH 配置、air init 生成 .air.toml 以及运行 air 自动重启服务,适合从 Python 或其他动态语言转向 Go 的开发者建立环境、依赖和包组织的第一层认知。

Go 开发
1 分钟

关于“Go 开发”类别

“Go 开发”类别的定位应围绕分类准入规则展开,重点说明它为什么存在、用于承载哪些内容,以及作者在发布文章时如何判断是否归入该类。正文给出的框架强调,需要先解释类别用途,再界定它与站内既有类别的差异,避免同一主题在多个分类之间重复归档或被拆分得过细。适合纳入的内容应由类别说明进一步明确,例如语言相关实践、开发经验、工具链使用或问题处理等方向,但具体范围需要以实际站点分类体系为准。该说明还要求评估类别的必要性,判断它是否应独立保留,或是否可以与其他类别、子类别合并。整体价值在于为知识库分类提供一致的判断依据,使读者和作者都能更快理解该分类的边界、用途和内容预期。

AES算法与接口解密
Python 开发
19 分钟

AES算法与接口解密

这篇笔记围绕 AES 对称加密的基础机制和接口响应解密实践展开,先说明 AES 以 128 位分组处理数据,密钥可为 128、192、256 位,并强调加解密使用同一密钥。内容对 ECB、CBC、CFB、OFB、CTR 等模式做了区分:ECB 不需要 IV 但相同明文块会产生相同密文,CBC 等模式依赖初始化向量来提升随机性,其中 CBC 会让每个块与前一块密文形成链式关系。实践部分先用 Python 和 pycryptodome 演示 ECB 解密流程,包括 Base64 解码、创建 AES.MODE_ECB 解密器、解密字节数据以及按 PKCS7 规则去除填充。随后以接口返回的 data 与 secret 为线索,通过 Chrome 全局搜索前端代码,定位到调用 Ie(e.data, e.secret) 后再 parseJson 的解密逻辑,并继续分析该函数实际使用 CryptoJS 的 AES-CBC、Pkcs7 padding 和 window.TurboApply.data.aesIv 作为 IV。文章还给出 Python 复现 AES-CBC 解密的代码结构,明确需要把 secret 和 iv 转为 UTF-8 字节、对密文做 Base64 解码、再调用 AES.new(key, AES.MODE_CBC, iv) 并 unpad。最后提醒固定 IV 会削弱 CBC 的安全性,容易造成相同明文产生可比较的密文模式;更合理的实现是每次加密生成随机且唯一的 16 字节 IV,并随密文一起传输,适合想理解接口加密分析、AES 模式差异和解密复现流程的开发者阅读。

爬虫