-
Golang实现RPC安全通信需在net/rpc或gRPC上叠加TLS:服务端用tls.Listen配置证书与mTLS,客户端用tls.Dial并校验证书;推荐gRPC因其原生HTTP/2支持、丰富生态及细粒度TLS控制。
-
Go命令报commandnotfound的真正原因是shell找不到go可执行文件,因安装后未将go/bin路径加入$PATH,需确认安装位置、正确配置对应shell的配置文件并重启终端验证。
-
修改slice底层数组元素可直接操作,但改变len或cap必须返回新slice并由调用方重新赋值;使用*[]T不仅无法可靠解决底层数组更换问题,还易引发datarace和不可预测行为。
-
Go的select在多个case就绪时伪随机选择,底层哈希打乱顺序后线性扫描,旨在避免饿死和隐式顺序依赖;default不破坏随机性,仅作为无就绪case时的非阻塞兜底。
-
Go中验证函数超时最推荐用context.WithTimeout配合goroutine,语义清晰可取消;若函数不支持context,则用time.After与channel组合实现超时判断。
-
Gotime包解析失败常静默返回零值,因布局须严格匹配参考时间"2006-01-02";格式化应优先用RFC3339等预定义常量;时区须显式指定,避免依赖默认本地时区。
-
Go微服务负载均衡需手动设计客户端路由,核心是维护健康实例列表并按轮询或加权轮询策略选节点;需结合服务发现、线程安全计数、平滑加权及集成HTTP客户端实现。
-
指针赋值复制地址,使多个变量共享同一内存,修改相互影响;值拷贝创建独立副本,互不干扰。1.指针赋值如pb:=pa,pb和pa指向同一变量,修改*pb影响原值;2.值类型如int、struct赋值时深拷贝,如p2:=p1后修改p2不影响p1;3.大结构体建议用指针传递,避免性能开销,如函数参数*Person;4.切片和map为引用类型,赋值时复制内部指针,仍共享底层数组或哈希表,修改会同步。理解“复制的是地址还是数据”是关键。
-
Go反射只能访问导出字段,需传结构体地址并调Elem(),Field(i)按索引取值须校验NumField(),FieldByName更安全但需检查IsValid()和CanInterface(),嵌入与指针字段需手动处理,避免nil解引用,性能差且易出错,仅适用于低频场景。
-
crypto/elliptic不能直接加密,仅支持密钥协商和签名;它提供点乘、密钥生成等底层数学操作,加密需结合crypto/ecdsa、curve25519或AES自行实现ECIES。
-
Go写二进制文件须用binary.Write、io.Write或[]byte操作,禁用字符串转换;binary.Write要求结构体字段导出、字节序明确、不支持map/slice;io.Write需检查返回值;变长数据需手动编码长度前缀。
-
t.Skip()在Golang测试中用于条件跳过,适用于环境依赖、资源密集、跨平台、未完成功能等场景,避免测试噪音。它与t.Fail()/t.Fatal()的本质区别在于:跳过表示测试不适用而非失败,不计入失败数,不影响CI/CD结果。最佳实践包括使用辅助函数、TestMain、环境变量、构建标签、清晰消息和定期审查,以保持测试集清晰可维护。
-
Go1.3起默认采用连续栈:初始栈2KB,扩容时复制旧栈并修正指针,消除分段栈的检查开销与GC扫描难题,但带来复制停顿;栈大小动态调整,上限1GB,超限仍panic;defer/recover在扩容中可靠,因运行时重定位_defer结构;监控StackSys可定位栈内存异常。
-
Go的http.Header非线程安全,并发读写会panic;Set/Add语义不同:Set覆盖、Add追加;多值字段应使用Values()而非Get()后切分;Header.Clone()可深拷贝隔离数据,但不解决并发安全。
-
多层指针是指向指针的指针,用于修改指针本身或与Cgo交互等场景。例如p2可访问原始值10;函数changePointer通过int修改外部指针指向为20。需注意空指针、可读性差及过度嵌套问题,建议仅在必要时使用。