-
Go数组是值类型、固定长度,栈或堆分配,不可扩容;声明需明确长度,如[3]int;传参时复制整个数组,修改不影响原数组,需传*[3]int指针才能修改;可转切片,但切片转数组需长度严格匹配;仅在值语义、定长、栈优化或CGO场景使用。
-
err!=nil有时不生效,因接口值由动态类型和动态值组成,仅当二者均为nil时才真为nil;传入*MyErr(nil)会使动态类型非空,导致判空失效。
-
在Go中,将新分配结构体的指针同时存入切片并返回给调用方,不会导致内存泄漏——因为Go的垃圾回收器(GC)会自动追踪所有可达引用,只要对象不再被任何活跃变量或数据结构引用,就会被安全回收。
-
httpmock是拦截并返回预设响应最省事的方式,它无缝接管http.DefaultClient和自定义client,无需改业务代码;需调用httpmock.Activate()启用、httpmock.DeactivateAndReset()清理,否则请求照发或污染后续测试。
-
答案是合理利用Goroutine、Channel与消息中间件并优化资源管理。通过控制goroutine数量、使用带缓冲channel和worker池平衡并发;选用NSQ或Kafka解耦分布式系统;复用对象、预分配内存、减少分配以降低GC压力,提升性能。
-
Excelize/v2是当前Go生态处理.xlsx最可靠的选择,但高度依赖文件合规性、写入方式与类型处理:不支持非标格式,中文需UTF-8,大批量须用SetSheetRow或StreamWriter,读公式/日期须判类型并手动计算。
-
unsafe.Pointer不能直接转int,因Go编译器禁止绕过类型安全检查,必须通过byte或*uintptr等中间类型桥接,且需确保uintptr转换不导致GC提前回收对象。
-
Golang网络代理通过客户端与服务器间的数据转发实现,核心包括连接管理、协议处理及TLS握手(HTTPS),使用net包可构建基础代理,goproxy等框架支持高级功能;性能优化可通过连接池、缓冲区设置、并发处理和pprof分析实现。
-
Go的并发内存模型通过“happens-before”原则确保操作的可见性和顺序。1.同一个goroutine中代码顺序即happens-before顺序;2.channel发送happens-before接收;3.Mutex.Unlockhappens-before下一次Lock;4.sync.Once保证初始化完成前的操作对所有后续访问可见;5.原子操作提供同步保障。若未显式建立该关系,则可能因重排导致行为不确定。
-
Go中可用带缓冲channel实现令牌桶限流:初始化容量为maxTokens的channel并预填满,请求时select尝试取令牌,成功则处理,失败则拒绝;后台goroutine定期补充令牌。
-
Go中error是值而非异常,需显式返回;panic仅用于不可恢复错误,业务错误必须返回error;应使用errors.Is判断嵌套错误、fmt.Errorf("%w")保留错误链、结构化AppError统一HTTP错误响应。
-
Go原生map并发读写会panic,因非线程安全;sync.Map仅适用于读多写少等特定场景,否则应优先用sync.RWMutex封装普通map。
-
Go错误是接口而非结构体,因需支持上下文定制;标准error接口仅含Error()方法;自定义错误可带字段便于类型断言;推荐用errors.Is/As处理嵌套错误,慎用%w包装,避免忽略错误或滥用panic。
-
Go中必须用sync.Mutex的场景是多个goroutine同时读写同一变量且至少有一个写操作时;正确用法是细粒度加锁、defer解锁、避免嵌套;读多写少可用RWMutex;优先考虑atomic或channel替代。
-
database/sql的QueryRow和Query默认不支持并发,因为sql.Rows和sql.Row实例不可跨goroutine复用,其内部游标和缓冲区状态要求Scan顺序执行;并发调用会触发panic。