💡 一句话总结:匿名结构体 = 临时数据打包神器,用完即走,不占编制!
啥是匿名结构体?
普通结构体像"正式员工",得先注册类型:
type Car struct {
Make string
Model string
Year int
}
camry := Car{
Make: "Toyota", Model: "Camry", Year: 2020}
匿名结构体?直接"外包上岗",类型?不存在的👇
camry := struct {
Make string
Model string
Year int
}{
Make: "Toyota", Model: "Camry", Year: 2020,
}
// 照样用:camry.Model ✅
什么时候用它?真实场景走起!
🎯 场景1:函数参数"临时打包"
func ShowProduct(p struct {
Name string
Price float64
}) {
fmt.Printf("%s: $%.2f\n", p.Name, p.Price)
}
// 调用时直接"现捏现用"
ShowProduct(struct {
Name string
Price float64
}{
"MacBook", 9999.00})
🤔 个人看法:这就像点外卖——不用自己买菜洗菜,直接下单开吃!但别顿顿都点,容易"营养不良"(代码难维护)。
🧪 场景2:单元测试快速Mock
mockDB := struct {
Query func(sql string) ([]Row, error)
}{
Query: func(sql string) ([]Row, error) {
return []Row{
{
ID: 1}}, nil // 假装查到了
},
}
// 直接传给被测函数,清爽!
⚙️ 场景3:JSON序列化"快闪"
data := struct {
Server string `json:"server"`
Uptime int `json:"uptime"`
}{
Server: "prod-01", Uptime: 42,
}
json.Marshal(data) // {"server":"prod-01","uptime":42}
⚠️ 踩坑提醒(血泪经验)
| 优点 | 缺点 |
|---|---|
| ✅ 写起来快,临时用真香 | ❌ 不能定义方法(想加行为?没门) |
| ✅ 减少类型污染,代码轻量 | ❌ 无法复用,复制粘贴警告⚠️ |
| ✅ 测试/配置场景神器 | ❌ 字段多了可读性暴跌📉 |
🎯 我的原则:核心业务用命名结构体,临时胶水代码用匿名结构体——就像厨房:主菜用专业厨具,拌个沙拉用一次性碗,合理分工!
最后唠两句
匿名结构体不是"银弹",但绝对是工具包里的"瑞士军刀"🔪。用对了场景,代码清爽如新;滥用?恭喜你,喜提"天书代码"成就📚。