
Go 结构体字段名不能含下划线,但可通过 json 标签将 JSON 字段(如 "Original_Name")映射到合法的 Go 字段(如 OriginalName),实现无缝解析。
go 结构体字段名不能含下划线,但可通过 `json` 标签将 json 字段(如 `"original_name"`)映射到合法的 go 字段(如 `originalname`),实现无缝解析。
在 Go 中解析 JSON 时,结构体字段名必须遵循 Go 的标识符规则:以字母或下划线开头,后续可含字母、数字或下划线,但不推荐以下划线开头(因表示非导出字段),且字段名本身不能包含中间下划线(如 Original_Name 是非法标识符)。然而,JSON 键名(如 "Original_Name")常含下划线,这并不影响解析——只需借助结构体标签(json tag)建立映射关系。
✅ 正确做法是:定义语义清晰、符合 Go 命名规范(驼峰式)的字段名,并通过 json:"Original_Name" 显式指定其对应的 JSON 键:
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"` // 将 "Original_Name" JSON 字段映射到 OriginalName 字段
}
完整示例:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
package main
import (
"encoding/json"
"fmt"
)
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"`
}
func main() {
data := `{"Name":"Jame","Age":6,"Original_Name":"Jameson"}`
var r Result
if err := json.Unmarshal([]byte(data), &r); err != nil {
panic(err)
}
fmt.Printf("Name: %s, Age: %d, OriginalName: %s\n", r.Name, r.Age, r.OriginalName)
// 输出:Name: Jame, Age: 6, OriginalName: Jameson
}
⚠️ 注意事项:
- json 标签中的键名区分大小写,必须与 JSON 中的实际键完全一致(包括大小写和下划线);
- 若 JSON 字段可能缺失,可添加 ,omitempty(如 json:"Original_Name,omitempty")避免零值覆盖;
- 字段必须首字母大写(即导出),否则 json 包无法访问(非导出字段会被忽略);
- 标签值支持额外选项,如 json:"original_name,string" 可用于将字符串数字(如 "123")自动转为整型。
总结:Go 不限制 JSON 键的命名风格,限制仅在于结构体字段本身。合理使用 json 标签,即可优雅、安全地桥接 JSON 命名约定与 Go 的语言规范。










