Golang中结构体的深入理解

Golang中结构体的深入理解 https://play.golang.org/p/iHqs7JIygdC

我做错了什么?

4 回复

感谢两位。这个方法有效

更多关于Golang中结构体的深入理解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你忘记用’}'闭合结构体。在我添加后,一切正常 😊

点击 format 会比 run 以更易理解的方式告诉你答案:

prog.go:12:1: 应为 ‘}’,却找到 ‘func’

这是因为 Go 现在试图将 func 用作结构体中的字段名,但由于 func 是保留关键字,这是不允许的。

只需正确闭合结构体定义,你的程序就能编译并运行。

在您提供的代码示例中,主要问题在于结构体字段的可见性规则和JSON序列化/反序列化的处理。以下是详细分析和修正:

问题分析:

  1. 结构体 Person 的字段 nameage 都是小写字母开头,这意味着它们是未导出的(私有字段),在 main 包外不可访问。
  2. 当使用 json.Marshal 序列化结构体时,由于字段未导出,JSON编码器无法访问这些字段,导致生成的JSON对象为空 {}
  3. 在反序列化时,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之间的转换。

回到顶部