Cobra与Viper构建Go命令行工具
介绍 Cobra 和 Viper 在 Go 项目中如何配合使用,讲清命令结构、参数解析、配置文件、环境变量以及一个完整的 CLI 实战示例。
Client-Go入门到控制器实战
从 client-go 的基本操作流程讲起,系统梳理 Informer、WorkQueue 和控制器模式,并给出一个可在两节点 playground 上实操的完整示例。
三台Ubuntu搭建高可用Kubernetes实验集群
基于三台 Ubuntu 主机,记录一次实验性质的高可用 Kubernetes 控制平面部署过程,并补充一套更完整的生产级高可用方案。
Pod生命周期、探针与资源限制
讲清 Kubernetes 中 Pod 的生命周期、liveness/readiness/startup 探针,以及资源 requests/limits 的作用和常见问题。
kubectl常用命令与YAML生成
梳理常用 kubectl 命令、如何快速生成基础 YAML,以及 kubectl 的 Bash 自动补全配置方法。
Kubernetes资源对象详解
从资源对象视角理解 Kubernetes,梳理常见资源分类、职责与一个完整应用部署案例。
Go语言反射
Go语言反射反射(reflection)允许程序在运行时检查变量的类型、读取值、修改值,甚至动态调用方法。它很强大,但也意味着更高的复杂度、更差的可读性和更弱的类型安全。因此Go社区的态度一直很明确:能不用反射就不用,必须动态处理时再用反射。 什么是反射普通代码在编译期就知道类型: var n int = 10fmt.Println(n + 1) 但有些场景在编译期并不知道实际类型,比如: 通用ORM:根据结构体字段生成SQL JSON/配置解析:根据tag映射字段 框架中间件:动态调用用户传入的方法 通用日志/调试工具:打印任意类型的值 这时就需要 reflect 包在运行时获取类型信息。 Go反射最核心的两个类型: reflect.Type:描述”类型” reflect.Value:描述”值” var x float64 = 3.14t := reflect.TypeOf(x)v := reflect.ValueOf(x)fmt.Println(t) // float64fmt.Println(t.Kind()) // float...
Go语言单元测试
Go语言单元测试Go语言自带了一套轻量级的测试框架——testing 包和 go test 命令。不需要引入第三方框架,开箱即用就能完成单元测试、基准测试和示例测试。这套工具的设计哲学和Go一脉相承:简单、显式、够用。 测试文件与函数的约定Go的测试遵循严格的命名约定,go test 依赖这些约定来发现和执行测试: 约定 规则 示例 文件名 必须以 _test.go 结尾 math_test.go 测试函数 必须以 Test 开头,参数为 *testing.T func TestAdd(t *testing.T) 函数名格式 Test + 被测函数名(首字母大写) TestCalculateSum _test.go 文件不会被编译到最终的二进制文件中,它只在 go test 时参与编译。 第一个单元测试假设我们有一个简单的计算模块: // calc.gopackage calcfunc Add(a, b int) int { return a + b}func Multiply(a, b int) int { ...
Go语言文件操作
Go语言文件操作文件操作是实际开发中的高频需求——配置读取、日志写入、数据导入导出都离不开它。Go标准库通过 os、io、bufio 三个包提供了从底层到高层的完整文件操作能力。 文件读取一次性读取:os.ReadFile适合读取小文件(配置文件、模板等),将整个文件内容一次性加载到内存: func main() { data, err := os.ReadFile("config.json") if err != nil { log.Fatal(err) } fmt.Println(string(data))} 注意:os.ReadFile 是Go 1.16引入的,替代了已废弃的 ioutil.ReadFile。文件过大时会占用大量内存,不适合处理GB级文件。 分片读取:Read + 固定缓冲区手动控制每次读取的字节数,适合处理大文件或需要流式处理的场景: func main() { file, err := os.Open("large.dat&...
Go语言泛型
Go语言泛型泛型(Generics)是Go 1.18引入的重大特性。在此之前,处理多种类型要么用 interface{} 丢失类型安全,要么为每种类型复制一份代码。泛型让我们可以编写一份代码处理多种类型,同时保留编译期类型检查。 泛型函数基本语法在函数名后用方括号声明类型参数(Type Parameter): // T 是类型参数,any 是类型约束(允许任意类型)func Print[T any](value T) { fmt.Println(value)}func main() { Print[int](42) // 显式指定类型 Print("hello") // 编译器自动推断类型为string Print(3.14) // 推断为float64} 多类型参数func Map[T any, R any](slice []T, fn func(T) R) []R { result := make([]R, le...










