随笔分类 - golang
摘要:很多区块链节点(如 Ethereum Geth、Arbitrum Nitro、Erigon 等)都是用 Go 语言编写的。运行时间一长,经常会遇到一个问题: 内存不断上涨,最后容器被 OOM Kill,节点重启,同步中断。 其实这个问题,Go 官方早就给了解决方案:GOGC 和 GOMEMLIMIT
阅读全文
摘要:Client复用安全性说明 问题:多个协程共享连接会混乱吗? 答案:不会混乱,是安全的! 技术原理 1. ethclient.Client 是线程安全的 根据 Go 以太坊库的设计: ethclient.Client 底层基于 rpc.Client rpc.Client 是线程安全的,允许多个 go
阅读全文
摘要:内存问题定位过程详解 问题背景 项目运行在Docker中,内存占用一直保持在5G左右 需要找出内存具体用在哪里 定位步骤 第一步:添加内存监控 1.1 添加账户缓冲区监控 在 worker/ethereum/writer/account.go 中添加了内存监控功能: // 每30秒输出一次缓冲区大小
阅读全文
摘要:在开发长期运行的服务时,如何让程序优雅退出是一个重要课题。今天我们来深入探讨Go语言中如何处理常见的进程信号,实现平滑关闭。 理解三个关键信号 1. SIGINT(信号2)- 礼貌的中断请求 全称:Signal Interrupt 触发方式:用户在终端按下 Ctrl+C 特点:可捕获,允许程序清理后
阅读全文
摘要:好的,我来帮你整理一个详细的博客,说明这个HTTP连接池和端口耗尽的问题。 Go HTTP连接池与端口耗尽问题深度解析 问题背景 在使用Go语言开发高并发应用时,经常会遇到这样的错误: dial tcp 192.168.31.212:8545: connect: cannot assign requ
阅读全文
摘要:1. 什么是原子操作? 原子操作(Atomic Operations)是指在并发环境下,不可分割的操作,即一个操作要么完全执行,要么完全不执行,不会被线程调度打断。Go语言通过 sync/atomic 包提供了一系列原子操作类型(如 atomic.Int64、atomic.Pointer 等),底层
阅读全文
摘要:1. 现象解析 在Go语言中,我们经常会看到这样的代码模式: type ExecutionResult struct { StateRoot common.Hash TxRoot common.Hash // ... 其他字段 } func (e ExecutionResult) MarshalJS
阅读全文
摘要:引言 Go 语言在 1.18 版本引入了泛型特性,为开发者提供了更强大的类型抽象能力。本文将通过一个以太坊客户端中的实际例子,深入探讨 Go 泛型中的类型约束语法,并对比其与传统结构体嵌入的区别。 泛型类型约束详解 基本语法 go type payloadType interface { *cape
阅读全文
摘要:在 Go 语言的并发编程中,我们经常会遇到这样的需求:后台处理一批数据或事件,并且希望在需要时能够优雅地终止处理过程。比如日志订阅、事件监听、数据流推送等场景。 本文以 go-ethereum 的事件订阅为例,介绍一种常见的“可控订阅/优雅退出”模式。 典型代码 以 go-ethereum 的合约事
阅读全文
摘要:在 go-ethereum (Geth) 中,交易类型(Transaction Types)是根据以太坊协议的不同阶段和升级(如 EIP 引入的改进)来区分的。以下是 LegacyTx、DynamicFeeTx 的主要区别以及其他常见的交易类型: 1. LegacyTx(传统交易) 定义:以太坊最初
阅读全文
摘要:1. 背景 在实际开发中,我们经常需要将结构体中的某些字段以 JSON 形式存储到 MySQL 的 text 或 json 字段中。Go 的 GORM 框架支持通过实现 driver.Valuer 和 sql.Scanner 接口,实现自定义类型的序列化和反序列化。 2. 关键接口 driver.V
阅读全文
摘要:在 Go 语言开发中,依赖循环(Cyclic Dependency)是一种常见但必须避免的问题。Go 不允许两个包相互导入,否则会导致编译失败。例如: A 依赖 B B 依赖 A 当 package A 依赖 package B,而 package B 又依赖 package A 时,Go 会报错,
阅读全文
摘要:引言 Go语言以高并发性能和简洁的内存管理著称,其独特的内存分配机制在保证开发效率的同时,实现了接近C/C++的性能。本文将深入剖析Go的内存管理设计,结合内存逃逸、多级缓存池、无锁化分配等核心机制,揭示其高效运作的秘密。 参考文档 https://www.bilibili.com/video/BV
阅读全文
摘要:Go中的context是一个非常重要的包,它用于在并发编程中传递请求范围内的值、取消信号以及死锁等相关信息。context最初被设计用于处理多线程、异步操作中传递取消信号和超时设置,尤其在HTTP请求和微服务中应用广泛。 什么是context? 在Go语言中,context包提供了一种跨API边界传
阅读全文
摘要:1. Map 的主要结构 map 的底层数据结构定义在 Go 源码的 runtime 包中,其核心结构体是 hmap。Go 的 map 使用 哈希表 存储键值对,并结合了**桶(bucket)**机制来优化存储和查找。 hmap 的主要字段 count:存储的键值对数量。 buckets:哈希桶的数
阅读全文
摘要:在Go语言中,自定义类型可以帮助我们更好地组织代码和增强可读性。在本篇博客中,我们将探讨如何创建一个自定义类型,并将其与Swagger文档集成,以便在API中正确序列化和展示。 1. 创建自定义类型 首先,我们定义一个名为 RechargeType 的自定义类型。这个类型将用于表示不同的充值方式。
阅读全文
摘要:在 Go 编程中,切片是一种非常常用的数据结构。理解如何正确地修改切片中的元素非常重要,特别是当我们需要更改这些元素的值时。在这篇文章中,我们将探讨在切片中修改元素的不同方法,并讨论何时使用值切片和指针切片。 1. 使用值切片 在 Go 中,使用值切片(例如 []wmsModel.OrderProd
阅读全文
摘要:1、Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。 必要条件: 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: 互斥:至
阅读全文
摘要:在现代金融系统的开发过程中,涉及的数据处理和业务逻辑异常复杂,要求开发者不仅需要掌握基础的编程技术,还需要理解和应用一些高级的技术和策略。本文将探讨在金融系统开发中需要关注的关键知识点,包括事务管理、流水记录、数据一致性、安全性等方面,帮助你构建稳定、安全且高效的金融系统。 1. 事务管理 确保AC
阅读全文
摘要:在 Go 语言中,方法接收者可以是值接收者或指针接收者,而 Go 为开发者提供了一个方便的功能:自动接收者类型转换。这个功能使得我们在调用方法时可以更加灵活,不必担心接收者类型是否完全匹配。然而,尽管这个机制带来了便利,但开发者仍然需要注意方法接收者类型的选择,因为它们在功能、性能以及并发安全性等方
阅读全文

浙公网安备 33010602011771号