-
何时使用单体 RESTful 服务
对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,而单体服务具有架构简单,部署简单,开发成本低等优点,可以帮助我们快速实现产品需求。
-
在早期经常遭到唾弃的就是在垃圾回收(下称:GC)机制中 STW(Stop-The-World)的时间过长。那么这个时候,我们又会好奇一点,作为 STW 的起始,Go 语言中什么时候才会触发 GC 呢?
1、什么是 GC
在计
-
使用Golang能够创建WebSocket通信,只需要使用golang.org/x/net/websocket包即可,该包有可能被墙,无法使用go get下载,但是我们可以从golang中国提供的地址下载,然后将包放在对应的路径下。
WebSocket是
-
gRPC客户端默认不支持轮询或随机负载均衡,需显式启用round_robin或自定义balancer;必须通过dns:///resolver获取多地址,且Go1.21+需配置ServiceConfig。
-
绝大多数业务写操作必须用db.Transaction而非手写Begin/Commit,因db.Begin()返回新事务实例tx,混用db会绕过事务直连数据库;tx提交或回滚后不可复用;db.Transaction仅捕获panic并回滚,不校验逻辑错误、不自动提交,易静默失败;嵌套事务实为SAVEPOINT;HTTP/缓存等I/O操作严禁入事务体,应移至tx.AfterCommit()或异步处理。
-
Go的reflect包不支持直接将string类型的reflect.Value转换为int,因为Go类型系统禁止跨类别(如字符串→数字)的底层类型转换;必须借助strconv等标准库进行语义解析。
-
要显示allocs/op,必须同时使用-benchmem参数和在基准函数中调用b.ReportAllocs();allocs/op比B/op更关键,因其反映堆分配次数与GC压力。
-
原型模式通过已有对象创建新对象,在Go中利用结构体复制和接口实现。值复制为浅拷贝,含指针字段时需深拷贝避免数据共享。可通过定义Cloner接口统一克隆行为,复杂结构推荐手动实现Clone方法并递归处理嵌套对象;对于多层嵌套或动态结构,可使用gob序列化实现通用深拷贝,但性能较低,高频场景应手写优化。选择策略:简单结构直接赋值,关键业务手动克隆,临时需求用gob。
-
Go的json.Unmarshal不会panic,非法JSON返回json.SyntaxError(含Offset定位),类型错误实为json.UnmarshalTypeError;需用errors.As捕获,避免字符串匹配,注意嵌套字段错误路径缺失、重复解析性能问题及部分解析导致的隐蔽错误。
-
Go语言中atomic包提供原子操作以实现并发安全的共享变量读写,相比互斥锁更轻量。1.常见函数包括Add、Load、Store、Swap和CompareAndSwap,支持int32、int64等类型,确保操作不可中断。2.典型应用是使用atomic.AddInt64实现多goroutine下的计数器递增,避免数据竞争,保证最终结果正确。
-
sync.Map不适合MapReduce中间结果存储,因其在高频写入与遍历混合场景下性能退化,且缺乏原子性“写入并返回当前值”语义,易致reduce阶段漏数据或重复计算。
-
享元模式在Go中通过结构体封装不可变内部状态、工厂复用实例、剥离可变外部状态实现;用sync.Map缓存共享对象,按需传入外部参数,必要时结合sync.Pool减少GC压力。
-
Go的json包默认将nil切片编码为null,而空切片[]T{}编码为[];若需保持RESTAPI合同一致性(如始终返回"addresses":[]),必须确保结构体字段初始化为空切片而非nil。
-
Go原生支持交叉编译到FreeBSD,仅限amd64和arm64架构(Go1.16起移除i386支持),需设GOOS=freebsd、GOARCH=amd64/arm64且CGO_ENABLED=0生成静态二进制;验证用file/ldd,注意ABI兼容性、noexec挂载及内核模块。
-
不会。Go1.20+禁止string与[]byte底层内存共享,强制复制以保障安全;唯一合法共享方式是unsafe.String([]byte),此时字符串为只读视图,但需确保底层数组生命周期足够长。