随笔分类 - go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
摘要:GOMAXPROCS 决定: 同一时间最多有多少个 goroutine 可以并行运行(占用 CPU)。 更准确说: 它决定 P(Processor)的数量。 一、回忆一下 GMP 模型 我们之前讲过: G = goroutine(任务) M = 线程(干活的) P = 调度资源(必须持有才能执行 G
阅读全文
摘要:前言 goroutine 初始栈很小(≈2KB),但可以自动变大。 那它是怎么做到的? 一、先说结论 goroutine 的栈扩容是通过: 在函数调用前做“栈空间检查”,如果不够,就调用 runtime 进行扩容。 关键机制是: stack guard + morestack 二、goroutine
阅读全文
摘要:前言 很多人听说: goroutine 很轻,可以开几十万 但为什么轻?到底轻在哪里? 我们从 内存、创建成本、切换成本、调度方式 四个维度拆开讲清楚。 一、最核心的一句话 goroutine 轻,是因为它是用户态调度 + 小栈 + 自己管理切换。 而线程: 是内核调度 + 大栈 + 内核切换。 差
阅读全文
摘要:前言 “能抢占”和“频繁抢占”是两回事。 如果抢占太频繁,会导致: 上下文切换开销大 cache 失效 调度成本增加 性能下降 所以 Go 的设计目标是: 能抢占,但不会乱抢占。 我们一步步讲清楚它是怎么控制频率的。 一、核心原则:不是随时抢占,而是“时间片 + 条件触发” Go 不会在每一行代码都
阅读全文
摘要:一、什么是“抢占式调度”? 先理解什么是“抢占”。 非抢占式(早期 Go) 早期 Go(1.14 之前): goroutine 只有在 函数调用 channel 操作 syscall runtime 检查点 才会被切换。 如果一个 goroutine 写成: for { } 会发生什么? 👉 它永
阅读全文
摘要:一、为什么需要调度模型? 先问一个问题: Go 里可以同时开成千上万个 goroutine,它是怎么做到的? 如果每个 goroutine 都对应一个操作系统线程,那系统早就炸了。 因为: 线程很重(几 MB 栈空间) 创建销毁成本高 线程切换开销大 所以 Go 自己实现了一套“用户级调度器”。 二
阅读全文
摘要:前言 在Go开发中,我们经常需要将结构体转换为map[string]interface{}类型,特别是在: 调用第三方API时 动态处理JSON数据时 需要灵活修改字段时 解决方案 利用JSON作为中间格式,实现结构体到Map的转换: func (req *LLMReq) Data() (map[s
阅读全文
摘要:前言 Go 语言(Golang)发展迅速,经常需要切换不同版本来进行开发、测试或兼容旧项目。GVM(Go Version Manager,由 moovweb 开发)是一个经典的 Go 版本管理工具,它可以轻松安装、管理多个 Go 版本,并切换使用。 虽然 GVM 项目已不再活跃维护(最后更新在 20
阅读全文
摘要:根本原因 :表中的 file_size 列可能包含 NULL 值(例如,对于未设置文件大小的记录)。 SUM() 函数将 NULL 视为忽略(因此它仅对非 NULL 值求和),但如果所有相关 file_size 值均为 NULL, 则 SUM(file_size) 的结果将为 NULL。 Go 尝试
阅读全文
摘要:前言 go 语言,使用 gorm 查询,报错: sql: Scan error on column index 1, name "created_at": unsupported Scan, storing driver.Value type []uint8 into type *time.Time
阅读全文
摘要:实现思路 使用 GORM 连接数据库时,检查数据库是否存在。 如果数据库不存在,执行 SQL 语句创建数据库。 然后重新连接到新创建的数据库,并进行后续操作(如自动迁移表结构)。 package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/
阅读全文
摘要:前言 在使用 github.com/fvbock/endless 时,windows 平台报错: 原因 github.com/fvbock/endless 这个库用到了相关 syscall.SIGUSR1 和 syscall.SIGUSR2 信号,这些信号是 Unix/Linux 下的用户自定义信号
阅读全文
摘要:前言 go项目运行报错: import cycle not allowed,导入循环(import cycle) 报错原因,在Go语言中,两个或更多的包之间形成了相互依赖的关系,即A包导入了B包,而B包又反过来导入了A包,形成一个循环。 这种循环会导致编译器无法确定每个包的完整依赖图,因为它们互相引
阅读全文
摘要:乐观锁简介 乐观锁(又称乐观并发控制)是一种常见的数据库并发控制策略。 乐观并发控制多数用于数据竞争(data race)不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。 它的作用是防止并发更新数据库中的数据,从而避免
阅读全文
摘要:gin使用fvbock/endless gin 正常使用注册路由时: package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context)
阅读全文
摘要:在Go语言中,GOPATH 是一个环境变量,用于指定Go语言的工作空间路径。它是Go语言中一个重要的概念,用于管理和组织你的Go项目。 GOPATH 指定了Go语言的工作目录,它包含了三个重要的子目录:src、pkg 和 bin 。这些子目录分别用于存放源代码文件、编译后的包文件和可执行文件。 当你
阅读全文
摘要:前言 使用 gorm 查询时,报错:stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64 is unsupported 代码如下 var total float64 res := db
阅读全文
摘要:# 前言 `protoc` 是 `protobuf` 文件(.proto)的编译器,可以借助这个工具把 `.proto` 文件转译成各种编程语言对应的源码,包含数据类型定义、调用接口等。 `protoc` 在设计上把 `protobuf` 和不同的语言解耦了,底层用 `c++` 来实现 `proto
阅读全文
摘要:# 前言 `google.protobuf.Struct` 是 `Google Protocol Buffers` 中的一种特殊类型,用于表示动态的键值对数据。它可以存储任意类型的数据,并提供了方便的方法来访问和操作这些数据。 `Struct` 类型通常用于在不事先知道数据结构的情况下传递和处理配置
阅读全文

浙公网安备 33010602011771号