-
1.问题现象描述
使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下:
jsonStr := `{"number":1234567}`
result := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonStr), &result)
if err != nil {
-
Golang的string类型底层数据结构简单,本质也是一个结构体实例,且是const不可变。
string的底层数据结构
通过下面一个例子来看:
package main
import (
"fmt"
"unsafe"
)
// from: string.go 在GoLand IDE中双击s
-
Go 语言中 goroutine + channel 通过通信的方式来共享内存,从而实现并发编程。
但同时 Go 也提供了传统通过共享变量,也就是共享内存的方式来实现并发。这篇文章会介绍 Go提供的相关机制。
1、
-
Go atomic.Value 的零值 Load 可以返回 nil,但 Store(nil) 会 panic;本文说明首次 Store 如何固定具体类型,以及如何用结构体或指针安全表达空配置状态。
-
Go regexp 的 Index 系列方法返回的是原字符串字节区间。本文用完整匹配和捕获组两个示例,说明如何安全切回原文、处理负数下标,并把中文文本的位置转换为字符序号。
-
Go 1.22 引入 reflect.TypeFor 后,泛型函数可以直接拿到类型参数 T 对应的 reflect.Type。本文用一个小型类型描述器说明 TypeFor、TypeOf、Kind 和 Implements 的边界。
-
Go math/bits.Mul 返回 hi 和 lo 后,如何判断乘积是否超出低半部,以及怎样用 Mul64、math/big 重建并核对完整结果。
-
sql.Named 能保留参数的业务名称,但不会替不同驱动改写 SQL 占位符。本文用 database/sql、MySQL、PostgreSQL 和 pgx 的边界说明命名参数如何落地,避免把参数语义和占位符语法混为一谈。
-
用 Go 的 filepath.WalkDir 遍历文件树时,如何跳过 .cache、.git 等隐藏目录但继续访问其他路径?本文给出处理 error、判断 DirEntry 和使用 fs.SkipDir 的最小写法,并说明 SkipAll、符号链接与根目录错误的边界。
-
通过一个可复现的 slog 小实验,拆开 LogValuer、Handler.Enabled 与 Logger.Enabled 的调用顺序,说明昂贵字段怎样延迟计算,以及等级过滤能省下什么成本。
-
用 Go 标准库 netip.Prefix.AppendTo 把 IPv4 与 IPv6 网段写入既有字节缓冲区,验证前缀长度、零值和容量边界,避免不必要的字符串分配。
-
使用指针返回可避免大结构体拷贝、提升性能,并支持修改原始数据。通过逃逸分析,Go能安全返回局部变量地址;基本类型指针需谨慎使用,常用于标记“空值”;当接口方法为指针接收者时,必须返回指针以满足接口实现。
-
明确模块边界需为每个组件设独立go.mod文件,统一主干版本管理,用replace/exclude控制依赖,自动化检测孤儿模块、版本一致性、循环引用及API兼容性。
-
ethclient.Dial返回nilclient且err为nil通常因传入空字符串、无效HTTP地址或本地节点未启用CORS/RPC;应使用DialContext配合超时,验证节点响应,正确配置证书与项目ID。
-
Go中可通过reflect.Value的Call方法动态调用函数或方法,适用于插件机制等场景;需确保函数可导出,使用reflect.ValueOf获取函数值,构造[]reflect.Value类型的参数并调用Call,返回值为[]reflect.Value类型,需注意参数类型匹配和接收者可寻址性,且应避免频繁使用以减少性能损耗。