-
gRPC流式通信由.proto文件中stream关键字位置决定:服务端流为rpcFoo(Req)returns(streamRes),客户端流为rpcFoo(streamReq)returns(Res),双向流为rpcFoo(streamReq)returns(streamRes);错误写法、message未显式定义、Send/Recv使用不当等均会导致运行时阻塞或数据错乱。
-
Go语言禁止指针运算以提升内存安全,具体表现为:1.不支持指针加减整数、指针间运算及整数与指针互转;2.仅允许取地址和解引用操作;3.普通指针不可直接类型转换。相比之下,C语言允许自由的指针算术和强制转换,易导致越界、野指针等风险。Go通过自动垃圾回收、边界检查、nil指针检测和栈逃逸分析等机制保障内存安全,而C依赖程序员手动管理内存。Go中遍历数组需用索引或range,无法像C那样通过指针递增遍历。尽管Go提供unsafe.Pointer实现底层指针操作,但需开发者自行确保安全,仅建议在必要时谨慎使用。
-
goroutine启动后没输出是因为main函数提前退出导致进程终止;必须用sync.WaitGroup或channel显式同步,Add和Done需守恒,wg.Add(1)应在goroutine启动前调用,deferwg.Done()确保计数释放。
-
iota是Go中专用于const块的预声明标识符,表示当前行在常量组中的索引(从0开始),每次换行自动递增;它被代码生成工具广泛依赖,用于自动生成安全、简洁、可维护的枚举常量。
-
Go语言强制显式处理error,必须作为最后一个返回值;应使用%w包装错误以支持上下文展开;避免中间层panic或log.Fatal;自定义错误仅在需额外字段或行为时引入。
-
用sql.Open("sqlite3",":memory:")即可创建独立、快速、无文件的内存数据库用于单元测试,需避免误写驱动名、复用实例、遗漏关闭及事务未提交等问题。
-
time.Parse解析失败的根本原因是layout与输入字符串不严格匹配,必须使用Go特定参考时间“2006-01-02”格式定义layout;中文或非标格式需预处理;应优先用time.ParseInLocation显式指定时区;Unix时间戳须先转int64再用time.Unix构造。
-
runtime.Stack是目前唯一合法获取goroutineID的方式,通过解析panic日志首行"goroutineN[state]:"提取数字,需注意缓冲区大小、正则匹配、禁用all=true等细节。
-
桥接模式通过接口与组合分离抽象与实现,如图形绘制中将形状与设备解耦,支持独立扩展,新增图形或设备无需修改原有代码,提升灵活性与可维护性。
-
Go指针禁止对不可寻址值取地址(如字面量、表达式结果、map元素、函数调用返回值),解引用nil指针必panic,传指针仅在需修改原值或值过大时必要。
-
Go不直接渲染SPA,而是托管前端产物并提供后端服务;需用fallbackhandler处理前端路由刷新404问题,共享路由配置避免硬编码,并通过预渲染提升SEO与首屏性能。
-
答案:使用Go的httptest包可无需启动服务器测试HTTP路由。1.将路由注册封装为函数返回Handler便于测试;2.用httptest.NewRequest创建请求,httptest.NewRecorder捕获响应;3.验证状态码、响应体,如测试/hello返回200和"Hello,World!";4.测试方法限制如POST/user/返回405;5.推荐表驱动测试覆盖多场景。
-
在Golang中,指针通过减少内存拷贝和允许直接操作底层数据提升性能。合理使用指针可显著优化结构体传递、链表与树等动态结构的构建及切片映射的高效组合。1.对大型结构体应尽量用指针传递以避免复制开销;2.利用指针构建链表、树等结构实现灵活插入删除;3.切片存储大型结构体时建议保存指针;4.注意避免空指针、野指针、并发同步等问题;5.权衡是否使用指针,非所有场景都适用。
-
命令模式通过将请求封装为对象,支持异步处理与撤销操作;结合事件队列可实现解耦与任务调度。
-
不能。runtime.GC()仅触发GC循环,不立即释放内存给系统;debug.FreeOSMemory()强制归还空闲页给OS,适用于突发高峰后长期低负载等极少场景,但受存活对象和内存碎片限制。