
结构体字面量是 go 中一种“语法层面直接构造结构体值的表达方式”,其核心在于“声明即初始化”,而非先创建空实例再赋值;它属于复合字面量(composite literal),与整数、字符串等字面量同属一类语言原语。
在 Go 中,“字面量(literal)”一词并不表示“值不可变”或“必须是常量”,而是强调该值是通过语言内置的语法形式直接、一次性地描述并构造出来的。例如 42 是整数字面量,"hello" 是字符串字面量,而 MyType{Field: value} 就是结构体字面量——它属于更广义的 复合字面量(composite literal),是 Go 规范中明确定义的一类表达式。
关键在于:字面量关注的是“如何写”,而非“值是否可变”。
即使你使用变量填充字段(如 MyType{Field: myVar}),只要整个结构体是用 {...} 语法一次性写出的,它就是字面量。这与下面的非字面量写法形成鲜明对比:
// ✅ 结构体字面量:语法简洁,一步构造
user := User{Name: "Alice", Age: 30}
// ❌ 非字面量:分步操作,先分配再赋值
var u User
u.Name = "Alice"
u.Age = 30甚至更典型的对比是:
// 字面量:结构清晰,意图明确,内存分配与初始化合一
config := Config{Timeout: timeoutSec, Retries: maxRetries}
// 等价但冗长的非字面量写法(不推荐,且无法直接用于函数参数或返回值)
c := new(Config)
c.Timeout = timeoutSec
c.Retries = maxRetries✅ 字面量的优势:
- 可读性强:代码结构与数据结构高度一致;
- 安全高效:编译器可优化内存布局,避免中间状态;
- 适用场景广:可直接作为函数参数、map 值、切片元素、返回值等(如 return Point{x: 1, y: 2})。
⚠️ 注意事项:
- 字面量要求所有字段(或指定字段)在编译期已知类型和名称,不支持运行时动态键(如 map 的 key 不确定时无法用字面量构造);
- 若结构体含未导出字段,字面量初始化仅在定义包内允许;
- 使用字段名(FieldName: value)是推荐写法,既提高可读性,也避免因字段顺序变更导致的隐式错误。
总结来说,“struct literal”中的 literal 指的是语法字面意义(syntactic literal),即 Go 语言为结构体提供的原生构造语法,与 []int{1,2,3}(切片字面量)、map[string]int{"a": 1}(映射字面量)同属一个设计哲学:用最贴近数据本质的方式,声明即构建。它不是“字面上的常量”,而是“语法上的直写”。










