-
JSON.Unmarshal传指针还是传值?传值会失败,必须传指针。Go的json.Unmarshal内部靠反射修改目标变量的内存内容,如果传入的是值(比如user而不是&user),它只能修改栈上的一份副本,原变量不受影响。常见错误现象:json.Unmarshal([]byte(`{"name":"a"}`),user)后user.Name仍是空字符串,无报错但无效果值类型(如struct、int、string)必须取地址传入;引用类型(如*struct、[]int、
-
GoWeb开发中应统一解析查询参数并封装分页响应。定义ListQuery结构体集中管理分页与过滤字段,用ShouldBindQuery自动校验;返回PageResult泛型结构,隐藏数据库细节,含数据、页码、总数、总页数及has_more标识。
-
必须从reflect.Method.Type().In(1)开始获取业务参数类型,跳过接收者;调用前须判IsValid()和Kind()==reflect.Func,且nil接口需预先检查,否则预热直接panic。
-
Service层是业务编排职责边界,须通过接口注入外部依赖、使用原生类型或domainstruct、避免日志和协议细节,函数应单一职责、输入结构化、错误类型化,并按复用性决定逻辑归属。
-
reflect不该直接用于字段级验证,因其仅支持类型检查而不提供验证逻辑,易导致代码难维护、类型不安全、性能差;应通过反射提取标签约束,交由明确的验证函数处理。
-
Go图片水印失败主因是解码未校验错误、坐标硬编码、透明度未用draw.Over及NRGBA类型、批量处理内存溢出;需检查err、动态计算位置、调整alpha并流式处理。
-
Go的json.Marshal默认忽略函数字段,但可通过实现json.Marshaler接口,将方法调用结果动态注入JSON输出,从而优雅地将计算型字段(如Value()、Size())作为JSON字段导出。
-
答案是使用反射遍历字段判断零值。通过reflect.Value获取结构体字段,逐个检查是否均为零值,支持指针解引用与嵌套结构体,适用于任意结构体类型的空值判断。
-
JWT的exp字段被忽略主因是未检查token.Valid或未启用时间校验;Go中需显式调用token.Valid并配置jwt.WithExpirationRequired(),同时确保系统时间同步。
-
指针比较基于内存地址:p1==p2为true因指向同一变量,p1==p3为false因地址不同,nil指针间相等;不同类型指针不可直接比较,需类型一致或转换;函数中可比较指针是否引用同一对象,值相等不意味指针相等。
-
Orchestration更适合强一致性、可追踪、易调试场景,需SagaCoordinator状态机协调;Choreography适合松散事件驱动协作,但须本地落库+幂等补偿。二者选型取决于失败传播责任边界。
-
Go中数组固定长度、值类型,切片动态灵活、引用底层数组;数组初始化需指定长度如[3]int{1,2,3},切片用[]int{1,2,3}或make([]int,3);截取切片共享底层数组,索引越界会panic。
-
net.ParseCIDR解析失败主因是输入格式不符,必须为“IP/掩码位数”形式;判断IP是否在子网应使用net.IPNet.Contains,避免手动计算;IPv4/IPv6映射由Contains自动处理;高频场景需预解析并缓存CIDR。
-
不可靠,因map遍历顺序随机且reflect.DeepEqual对nil/空slice、未导出字段、func、interface{}中类型不一致零值等场景处理失败;推荐用cmp.Equal配合cmpopts定制化比较。
-
OpenTelemetry的context.Context无法自动透传至RPC调用,因net/rpc和多数框架不支持trace上下文注入/提取;需手动通过propagation.TraceContext在请求头中编码traceparent等字段,并确保client注入与server提取使用相同传播器且key全小写。