Golang新手语法问题求助

Golang新手语法问题求助 大家好,

我正在尝试理解这个结构体的语法。对我来说比较陌生的是末尾的json标签?这是json特有的吗?以前从未遇到过这种情况…而且Go语言教程似乎没有涉及这个内容,可能是我遗漏或忘记了。

type response2 struct {
Page   int      `json:"page"`
Fruits []string `json:"fruits"`
}

我理解的部分是:我们正在创建一个名为response2的自定义类型,它是一个结构体。该结构体包含两个元素:

  • Page变量,类型为int
  • Fruits变量,类型为[]string

这个json字符串是什么意思?


更多关于Golang新手语法问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

啊,谢谢。我会阅读的。

更多关于Golang新手语法问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 gt33m,

你可以查看这个链接作为参考:https://golang.org/pkg/encoding/json/ 它解释了相关含义。

该链接专门用于理解结构体的json标签。您提到的标签只是一个标签。例如,如果您初始化一个没有值的对象,它将返回您分配的名称标签。

没关系,我参考的那篇博客回答了我的问题。

字段声明后可以跟一个可选的字符串字面量(标签),该标签会成为对应字段声明中所有字段的属性(单个字段声明可以指定多个标识符)。

谢谢Adriel。

这个标签语法是结构体特有的吗?还是也可以在其他情况下使用?

我发现这篇文章(https://medium.com/golangspec/tags-in-golang-3e5db0b8ef3e)更容易理解 😉 可能对其他有同样问题的人会有帮助。

在Go语言中,结构体字段末尾的json:"..."标签是结构体标签(struct tags),用于在序列化和反序列化JSON数据时指定字段名称的映射关系。这不是JSON特有的,而是Go语言反射机制的一部分,可以被多个包使用(如encoding/jsonencoding/xml等)。

解释:

  • json:"page":当结构体序列化为JSON时,字段Page在JSON对象中对应的键名为"page";反之,当从JSON反序列化时,键"page"的值会被映射到Page字段。
  • json:"fruits":同理,字段Fruits在JSON中对应的键名为"fruits"

如果没有这些标签,默认情况下,encoding/json包会使用字段名(如Page)作为JSON键名。标签允许你自定义键名,例如使用小写(符合JSON常见约定)。

示例代码:

package main

import (
	"encoding/json"
	"fmt"
)

type response2 struct {
	Page   int      `json:"page"`
	Fruits []string `json:"fruits"`
}

func main() {
	// 序列化结构体到JSON
	res := response2{Page: 1, Fruits: []string{"apple", "peach"}}
	jsonBytes, _ := json.Marshal(res)
	fmt.Println(string(jsonBytes))
	// 输出: {"page":1,"fruits":["apple","peach"]}

	// 从JSON反序列化到结构体
	jsonStr := `{"page": 2, "fruits": ["banana", "orange"]}`
	var res2 response2
	json.Unmarshal([]byte(jsonStr), &res2)
	fmt.Printf("Page: %d, Fruits: %v\n", res2.Page, res2.Fruits)
	// 输出: Page: 2, Fruits: [banana orange]
}

其他用途: 结构体标签也用于其他场景,如数据库ORM映射(例如db:"column_name")或XML处理(例如xml:"attribute")。语法是反引号内的键值对,多个标签用空格分隔,例如:

type Example struct {
	Field string `json:"field" xml:"field" db:"column_name"`
}

通过反射包reflect,可以自定义处理这些标签,但encoding/json等标准库包已内置支持。

回到顶部