-
Go中的值类型包括基本类型、数组、结构体和指针,作为函数参数时会被复制,函数内操作的是副本,不影响原值;例如结构体传参修改后原值不变;若需修改原值或提升性能,应使用指针传参,因指针复制的是地址,可指向并修改原始对象;小对象值传递开销小,大对象建议用指针避免性能损耗;字符串底层为只读,复制开销较小。
-
Go切片的索引访问仅允许在[0,len(s))范围内,即使cap(s)更大,超出len的元素也无法通过下标直接访问;必须通过合法切片表达式扩展长度后才能操作。
-
必须使用gRPC的status和codes包进行标准化错误处理:codes定义整数状态码(如codes.NotFound),status封装码、消息与详情为可序列化*status.Status对象;服务端用status.Errorf或WithDetails返回,客户端用status.FromError解析,禁用字符串匹配。
-
Go是构建Serverless函数的优选语言,但需适配各平台入口签名、静态编译、外部初始化、结构化日志及上下文超时控制。
-
为什么直接os.WriteFile不算原子写入因为磁盘写入不是瞬间完成的,os.WriteFile会先清空原文件再写入新内容。如果中途崩溃或被中断,文件就处于损坏或截断状态——用户读到的是半截数据,而不是旧版或新版。真正的原子写入必须保证:要么是完整的旧内容,要么是完整的新内容,中间态不可见。Linux/macOS下靠rename(2)系统调用实现:先写入临时文件(同目录),再用os.Rename替换原文件——该操作在绝大多数文件系统上是原子的Windows下略有不同:os.R
-
在Golang中,错误处理通过返回值显式处理可预见问题,异常则用panic和recover处理严重运行时问题。1.错误(error)用于预期可能出错的情况,如文件读取失败,需主动检查并处理;2.异常(panic)用于程序无法继续执行的意外情况,如数组越界,应尽量避免滥用;3.建议优先使用error处理常规错误,保留panic于真正意外场景;4.正确处理error需检查返回值、记录或注释忽略的错误、自定义错误信息、包装错误链、判断错误类型;5.panic应配合defer和recover使用,但不推荐用于常规
-
suffixarray.New比strings.Index慢因构建后缀数组需O(nlogn)预处理,适合同一长文本(>10KB)上百次搜索;单次或少量搜索应直接用strings.Index。
-
够用但需防goroutine泄漏;用map[string][]chaninterface{}实现轻量事件总线,适用于中小型服务跨模块通信,关键要确保订阅者及时消费消息,避免缓冲区堆满导致Publish阻塞。
-
Go的reflect.StructTag解析会将反斜杠视为转义符导致截断,需源码写\\\\保留单个\;含空格/冒号等特殊字符的值必须用双引号包裹;key严格大小写敏感且不可有空格;StructTag不解析语义(如.),需上层自行处理。
-
在Go中使用json.Unmarshal解析JSON数组时,所有数字(无论JSON中是整数还是浮点数)均被默认反序列化为float64类型,这是由JSON规范和Go标准库设计共同决定的确定性行为。
-
ELK是Elasticsearch、Logstash、Kibana的合称,实际生产中需加入Filebeat构成ELKB;Logstash因资源消耗大不宜直连业务机,Filebeat轻量负责采集,其registry文件丢失会导致日志重复或遗漏;ES索引需按日期命名以支持ILM和查询优化;跨网段时Filebeat与Logstash间必须启用TLS加密。
-
Go不推荐照搬经典解释器模式,应采用组合+函数式+简单AST解决具体语法解析问题,优先使用text/scanner等标准库工具,避免过早抽象和空接口断言。
-
Go是静态类型语言,interface{}并非“万能类型占位符”,而是一个具体类型;因此func()interface{}不能自动接收func()string或func()int等函数——必须显式转换或重构签名以满足类型系统约束。
-
JSON序列化反序列化最快上手但有坑:需字段可导出且类型支持,不支持func/chan等,性能差10–100倍;copier反射拷贝更通用但需注意nil切片/map;手写Clone最可控,须显式处理引用类型;sync.Mutex等不可拷贝类型应共享指针或重置。
-
在Golang中,指针通过减少内存拷贝和允许直接操作底层数据提升性能。合理使用指针可显著优化结构体传递、链表与树等动态结构的构建及切片映射的高效组合。1.对大型结构体应尽量用指针传递以避免复制开销;2.利用指针构建链表、树等结构实现灵活插入删除;3.切片存储大型结构体时建议保存指针;4.注意避免空指针、野指针、并发同步等问题;5.权衡是否使用指针,非所有场景都适用。