谈谈Go语言的字符串设计
作者从一个实际的内存泄漏问题说起:在使用GoJieba库时,一段测试代码的内存持续增长。经过排查,发现问题出在调用C.CString后未手动释放内存——一个因思维惯性导致的“白痴”Bug。 这个Bug的背后,是Go字符串与C字符串在内存模型上的根本差异。C语言以‘\0’作为字符串终结符,导致字符串无法直接复用父字符串的内存。而Go的字符串采用长度记录,设计上支持高效的子串内存共享。因此,当通过cgo的C.CString将Go字符串转换为C字符串时,必须分配全新的内存空间,这就要求开发者必须负责手动调用C.free进行释放,不能像使用C++的c_str()那样想当然地复用内存。 文章最终回归文档,用cgo官方示例明确了这一“必须释放”的责任。这个小小的踩坑经历,提醒所有涉及跨语言内存管理的开发者:务必理解底层设计差异,严格遵守接口契约。