4 回复
你忘记用’}'闭合结构体。在我添加后,一切正常 😊
点击 format 会比 run 以更易理解的方式告诉你答案:
prog.go:12:1: 应为 ‘}’,却找到 ‘func’
这是因为 Go 现在试图将 func 用作结构体中的字段名,但由于 func 是保留关键字,这是不允许的。
只需正确闭合结构体定义,你的程序就能编译并运行。
在您提供的代码示例中,主要问题在于结构体字段的可见性规则和JSON序列化/反序列化的处理。以下是详细分析和修正:
问题分析:
- 结构体
Person的字段name和age都是小写字母开头,这意味着它们是未导出的(私有字段),在main包外不可访问。 - 当使用
json.Marshal序列化结构体时,由于字段未导出,JSON编码器无法访问这些字段,导致生成的JSON对象为空{}。 - 在反序列化时,
json.Unmarshal也无法设置未导出的字段值,因此反序列化后的结构体字段保持零值。
修正后的代码示例:
package main
import (
"encoding/json"
"fmt"
)
// 将字段首字母大写以导出它们
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
// 创建Person实例
p := Person{Name: "Alice", Age: 30}
// 序列化为JSON
jsonData, err := json.Marshal(p)
if err != nil {
fmt.Println("Error marshaling:", err)
return
}
fmt.Println("JSON:", string(jsonData)) // 输出: {"name":"Alice","age":30}
// 反序列化
var p2 Person
err = json.Unmarshal(jsonData, &p2)
if err != nil {
fmt.Println("Error unmarshaling:", err)
return
}
fmt.Printf("Struct: %+v\n", p2) // 输出: Struct: {Name:Alice Age:30}
}
关键点说明:
- 结构体字段必须首字母大写才能被
encoding/json包访问。 - 使用结构体标签(如
json:"name")可以指定JSON序列化时的字段名称,保持JSON键为小写。 - 修正后,序列化和反序列化都能正确工作,输出预期的JSON数据和结构体值。
通过这个修正,您的代码将正确处理结构体与JSON之间的转换。

