go 结构体嵌入

在Go语言中,结构体不支持继承。Go语言没有类的概念,因此结构体之间不能像面向对象语言中的类继承一样进行继承。

相反,Go语言中的结构体可以通过在一个结构体中嵌入另一个结构体来实现类似继承的效果,这被称为结构体嵌入或匿名字段。

以下是一个示例,展示了如何使用结构体嵌入来模拟继承的效果:

go
import (
	"encoding/json"
	"fmt"
)

type SteamData struct {
	Level        int32 `protobuf:"varint,1,opt,name=level,proto3" json:"level,omitempty"`
	CreatedYears int32 `protobuf:"varint,2,opt,name=created_years,json=createdYears,proto3" json:"created_years,omitempty"`
	PlayedHours  int32 `protobuf:"varint,3,opt,name=played_hours,json=playedHours,proto3" json:"played_hours,omitempty"`
	GameCount    int32 `protobuf:"varint,4,opt,name=game_count,json=gameCount,proto3" json:"game_count,omitempty"`
}

type GameUrl struct {
	// 定义GameUrl结构体的字段
}

type GameUrl2HoursMap struct {
	// 定义GameUrl2HoursMap结构体的字段
}

type SteamInfo struct {
	SteamData
	GameUrls []GameUrl         `json:"game_urls"`
	GameMap  GameUrl2HoursMap  `json:"game_map"`
}

func main() {
	// 创建一个SteamInfo对象
	info := SteamInfo{
		SteamData: SteamData{
			Level:        10,
			CreatedYears: 3,
			PlayedHours:  100,
			GameCount:    5,
		},
		// 设置其他字段的值
	}

	// 将对象序列化为JSON字符串
	serializedData, err := json.Marshal(info)
	if err != nil {
		fmt.Println("序列化失败:", err)
		return
	}

	fmt.Println(string(serializedData))
}

在上述示例中,SteamInfo结构体通过使用结构体嵌入的方式将SteamData结构体嵌入其中。这意味着SteamInfo结构体继承了SteamData结构体的字段和方法。

输出的JSON字符串将具有以下格式:

json
{
  "level": 10,
  "created_years": 3,
  "played_hours": 100,
  "game_count": 5,
  "game_urls": [],
  "game_map": {}
}

请注意,结构体嵌入的字段在JSON序列化时会直接展开在外层结构体中,而不会形成嵌套的结构。

posted @ 2023-08-07 12:01  若-飞  阅读(38)  评论(0编辑  收藏  举报