-
拦截器在Go语言gRPC中用于实现日志、认证等通用逻辑,分为一元和流式两种类型。一元拦截器处理普通RPC调用,通过grpc.UnaryInterceptor注册,可在请求前后执行日志记录等操作;流式拦截器处理流式接口,通过grpc.StreamInterceptor注册,适用于客户端流、服务端流或双向流场景;实际应用中可结合go-grpc-middleware库使用ChainUnaryServer和ChainStreamServer组合多个拦截器,如日志、认证(从metadata提取token验证)和错误
-
Add按纳秒偏移,适合精确时间间隔;AddDate按日/月/年逻辑偏移,适合业务语义日期增减,如账单周期、生日提醒,且自动处理月末越界回滚。
-
用abigen生成Go结构体需:1.从对应go-ethereum源码编译abigen;2.使用合约最终编译的ABIJSON;3.命令中--type名与合约名一致;4.检查生成方法参数类型是否正确。
-
defer关键字用于延迟执行函数,确保资源释放等操作在函数返回前执行;多个defer按后进先出顺序执行;参数在defer声明时求值,闭包可实现延迟取值;常配合recover捕获panic。
-
在Golang中使用反射检测方法是否存在时,必须确保方法名首字母大写且接收者类型匹配。1.获取reflect.Type后调用MethodByName并检查返回值ok;2.方法名必须首字母大写否则无法导出;3.若方法为指针接收者定义,则传入的实例或类型必须是指针类型,也可使用Elem()统一处理;4.结构体与指针接收者同时存在同名方法时,MethodByName返回的方法取决于传入的类型是结构体还是指针。
-
Go的http.Redirect默认是302(临时重定向),非301;真要永久跳转须显式传http.StatusMovedPermanently,否则影响SEO、缓存及浏览器行为。
-
Go微服务中不能直接用net/http实现负载均衡,因其无客户端LB能力;应通过服务发现(如Consul)+客户端LB(如kitex)或ServiceMesh(如Istio)分层解决。
-
Go写syslog首选unixsocket(/dev/log),UDP需带端口且设超时,TCP更可靠;标准log/syslog仅支持纯文本,结构化日志需logrus+RFC5424或zerolog直写JSON;容器中须动态fallback并验证通路。
-
Go函数必须显式返回error才能参与错误传播;应始终在函数签名中包含error、用%w包装错误、errors.Is/As判断类型、早失败快返回、不忽略Close错误。
-
必须用%w才能形成可展开的错误链,否则errors.Is和errors.As失效;%w仅支持一个且须在末尾,多%w编译失败;不可对nil或非error类型使用%w;fmt.Errorf+%w表因果包装,errors.Join表并列聚合。
-
最简GET写法是http.Get,但必须deferresp.Body.Close();POST需用http.NewRequest+Client.Do;超时须用带Timeout的http.Client;JSON操作要检查marshal/unmarshal错误并正确处理Body。
-
Go中对未关闭的无缓冲或带缓冲通道使用forrange会永久阻塞,需明确限制接收次数或关闭通道以避免程序挂起。
-
fmt.Printf调试易埋坑:不换行、不刷缓冲、不区分环境,导致输出延迟或泄露;应加\n或flush,慎用运行时开关,优先编译期控制。
-
答案是:Go语言中RPC错误捕获需通过显式检查返回值实现。1.客户端调用client.Call或client.Go后必须检查error字段,异步调用需从<-call.Done获取call.Error;2.服务端方法应以error为最后一个返回值,以便将错误序列化传回客户端;3.需处理rpc.Dial连接错误、网络中断及超时等底层问题,建议结合context.WithTimeout并添加重试机制;4.可封装统一的错误处理函数,集中记录日志,确保每次调用都检查error,避免遗漏。
-
根本原因是Linux内核socket发送队列(sk->sk_write_queue)持续积压,导致Go的net.Conn.Write()在内核层阻塞;主因包括wmem_default过小、网卡中断/softirq不均衡、应用层缺乏背压机制。