Go语言技术文章
-
os.Args是Go程序启动时自动填充的字符串切片,索引0为可执行文件路径(或调用名),后续为原始命令行参数;不解析flag、不校验、需手动检查长度防panic。330 收藏 -
gob仅适用于同一版本Go程序间可信的短期数据传输;它不跨语言、无版本兼容性、要求字段导出且类型提前注册,结构变更易导致panic。330 收藏 -
Go调用系统命令应使用os/exec.Command拆分参数,需shell特性时用sh-c并确保输入可控;读写/proc或/sys用os.ReadFile/WriteFile并处理换行和权限;监听文件系统用fsnotify并手动递归添加路径、位运算判断事件;95%系统操作无需CGO。330 收藏 -
errors.Is比==更安全,因为它递归检查错误链中是否包含指定哨兵错误,而==仅比较指针或值相等性,无法识别被fmt.Errorf("%w")包装的哨兵错误。330 收藏 -
fmt包是Go语言中用于格式化输入输出的核心工具,提供Print、Println、Printf、Sprintf和Fprintf等函数,支持多种格式化动词如%v、%d、%s等,可精确控制输出样式。通过宽度、精度和对齐设置(如%8s、%.2f),能优化输出格式;实现Stringer接口的String方法可自定义类型输出。熟练掌握fmt包可提升代码可读性和开发效率。330 收藏 -
Go中数组传参复制全部数据,切片只传指针、len和cap三个字段;大数组不加传参是性能雷区;append可能创建新底层数组,需用s=append(*s,x)修改原切片;初始化时指定cap可避免多次扩容;len==cap可判断是否即将扩容;共享底层数组易引发隐蔽bug,可用copy或append([]T(nil),src...)深拷贝;固定长度场景数组更安全高效。330 收藏 -
必须用sync.Mutex的场景是多个goroutine同时读写同一内存且含写操作;sync.WaitGroup用于等待goroutine结束,需Add、Done、Wait严格配对;二者可安全组合,但职责分离:Mutex管数据访问,WaitGroup管生命周期。330 收藏 -
uintptr是Go中唯一能与指针双向无损转换的整数类型,需经unsafe.Pointer中转,仅支持指针算术,不参与GC追踪,滥用将导致内存安全风险。330 收藏 -
在Go中,可通过reflect.TypeOf(v).Kind()==reflect.Ptr快速检测任意interface{}值是否底层为指针类型;若已知具体类型,也可使用类型断言或类型开关进行更安全、高效的判断。330 收藏 -
根本原因是结构体字段未导出或YAML键名与字段标签不匹配;需确保字段首字母大写、正确使用yaml:"key"标签,并传入结构体指针,同时注意embed.FS路径绑定和错误检查。330 收藏 -
热更新配置不能只靠os.ReadFile轮询,因存在读取中途文件写入的竞态、无法感知原子替换、浪费CPU;应使用fsnotify监听内核事件,并用sync.RWMutex或atomic.Value安全加载,配合校验与降级。330 收藏 -
够用,但仅限学习和本地调试;真实项目中直接用map存用户会导致数据丢失、并发panic、无法查重分页,需第一版就考虑存储边界与并发安全。330 收藏 -
Go语言中死锁常因goroutine在channel操作上相互阻塞且无其他goroutine推进导致,如向无缓冲channel发送数据而无接收者时触发运行时死锁报错。330 收藏 -
Go反射无法设置私有字段的根本原因是运行时硬编码了导出性检查:field.IsExported()==false时直接panic,这是语言级安全边界;同一包内可行路径是reflect.ValueOf(&s).Elem()起点并确保CanSet()为true。330 收藏 -
状态模式在Go中应基于组合而非继承,通过接口定义行为、结构体实现状态逻辑,并由上下文封装受控的状态切换,避免条件分支与并发竞态。330 收藏