-
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能安全返回局部变量地址;基本类型指针需谨慎使用,常用于标记“空值”;当接口方法为指针接收者时,必须返回指针以满足接口实现。
-
明确模块边界需为每个组件设独立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类型,需注意参数类型匹配和接收者可寻址性,且应避免频繁使用以减少性能损耗。
-
Go1.13通过%w支持错误包装,结合errors.Unwrap、Is和As实现多级错误溯源与类型判断,自定义错误需实现Unwrap方法以支持链式解析,避免重复包装和格式误用可提升可维护性。
-
Golang应用部署与运维自动化通过容器化、CI/CD、可观测性和IaC实现高效交付;容器化利用多阶段构建和精简镜像提升部署效率与稳定性,CI/CD通过自动化测试、构建、部署及回滚机制确保发布可靠,结合GitLabCI/CD、GitHubActions或ArgoCD等工具实现全流程自动化。
-
copy函数仅浅拷贝,对指针、map、slice等引用类型只复制地址;修改新切片的嵌套结构会影响原切片,适用场景限于基本类型或无引用字段的struct。
-
推荐使用流式读写处理大文件,通过bufio缓冲分块读取避免内存溢出,按行处理可用Scanner,大块读取用固定buffer,随机访问可选mmap,注意缓冲区大小、资源释放与对象复用,结合场景平衡性能与内存。
-
用net/http下载图片需自定义http.Client并设置超时、重定向、User-Agent,流式写入避免OOM,优先从Content-Disposition或Content-Type推导文件名并过滤路径遍历。
-
SSTable持久化核心在于数据块组织、读取可定位与写入安全性:block内key严格升序,采用前缀共享编码;indexblock必须独立存放于文件末尾并由footer(最后8字节)定位;写入需临时文件+Sync+Rename原子保证;filterblock不可省,应per-block序列化。
-
Go服务应暴露/healthz端点返回200OK,避免副作用;/readyz分离依赖检查,用带超时的PingContext;K8s探针与DockerHEALTHCHECK无关,应统一配置于K8s资源中。
-
Go中有效Deprecated注释需顶格写//Deprecated:后跟空格,紧邻导出标识符上方且无空行;gopls据此提示弃用,但无编译警告,需配合运行时panic或静态检查工具增强约束。