Golang中结构体包含URL字段是否合理?
Golang中结构体包含URL字段是否合理? 你好
看到下面这个库的结构体。在结构体中使用url标签是正常的吗?我之前只见过json或xml标签,这个对我来说很新奇。代码应该会进一步发送,然后用json进行post请求。
type ActivitiesCreateOptions struct {
Subject string `url:"subject,omitempty"`
Done uint8 `url:"done,omitempty"`
Type string `url:"type,omitempty"`
DueDate string `url:"due_date,omitempty"`
DueTime string `url:"due_time,omitempty"`
Duration string `url:"duration,omitempty"`
UserID uint `url:"user_id,omitempty"`
DealID uint `url:"user_id,omitempty"`
PersonID uint `url:"person_id,omitempty"`
Participants interface{} `url:"participants,omitempty"`
OrgID uint `url:"org_id,omitempty"`
}
谢谢
更多关于Golang中结构体包含URL字段是否合理?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的分享。您现在有两个标签,一个是json标签,另一个是uri标签。那么在这种情况下,"uri"标签仅用于个人用途,因为marshal/unmarshal只能使用json标签,对吗?
这是Go语言中可通过反射发现的标签,例如
t := reflect.TypeOf(object)
field := t.Field(0)
//field, _ := t.FieldByName("Age") //另一种方式
fmt.Print(field.Tag.Get("something"))
因此,这是相当常见的用法,你的库可以使用这些标签对结构体进行Marshal/Unmarshal操作。
示例见 https://play.golang.org/p/70yXwA0R9Ou,我添加了json标签来告诉json.Marshal如何序列化数据。如你所见,字符串字段的打印结果与标签中的定义完全一致,而带有omitempty标签的字段在值为nil时不会被序列化。另外,结构体中有两个相同标签字段user_id,已在示例中修正。
func main() {
fmt.Println("hello world")
}
在Go语言中,结构体使用url标签是完全合理且常见的做法,特别是在处理HTTP请求参数时。url标签通常用于库如go-querystring,它可以将结构体字段序列化为URL查询字符串参数。这在构建GET请求或需要将数据编码为查询参数的POST请求时非常有用。
以下是一个示例,展示如何使用带有url标签的结构体生成查询字符串:
package main
import (
"fmt"
"net/url"
"github.com/google/go-querystring/query"
)
type ActivitiesCreateOptions struct {
Subject string `url:"subject,omitempty"`
Done uint8 `url:"done,omitempty"`
Type string `url:"type,omitempty"`
DueDate string `url:"due_date,omitempty"`
DueTime string `url:"due_time,omitempty"`
Duration string `url:"duration,omitempty"`
UserID uint `url:"user_id,omitempty"`
DealID uint `url:"deal_id,omitempty"` // 注意:原代码中DealID使用了错误的标签"user_id",应更正为"deal_id"
PersonID uint `url:"person_id,omitempty"`
Participants interface{} `url:"participants,omitempty"`
OrgID uint `url:"org_id,omitempty"`
}
func main() {
opts := ActivitiesCreateOptions{
Subject: "Meeting",
Done: 1,
UserID: 123,
DealID: 456,
}
values, err := query.Values(opts)
if err != nil {
panic(err)
}
// 生成URL编码的查询字符串
queryString := values.Encode()
fmt.Println("Query string:", queryString) // 输出:subject=Meeting&done=1&user_id=123&deal_id=456
// 在实际HTTP请求中使用,例如构建完整URL
baseURL := "https://api.example.com/activities"
fullURL := baseURL + "?" + queryString
fmt.Println("Full URL:", fullURL)
}
在这个示例中,我们使用了go-querystring库的query.Values函数将结构体转换为url.Values,然后编码为查询字符串。这对于API请求非常方便,特别是当结构体字段较多时,能自动处理参数编码。
注意:原代码中DealID字段的标签错误地写成了url:"user_id,omitempty",这会导致参数冲突,应更正为url:"deal_id,omitempty"。在实际使用中,确保每个字段的标签键唯一,以避免数据覆盖。
如果这个结构体用于JSON POST请求,你可能需要同时使用json标签,例如:
type ActivitiesCreateOptions struct {
Subject string `url:"subject,omitempty" json:"subject,omitempty"`
// 其他字段类似添加json标签
}
这样,同一个结构体可以灵活用于不同场景(URL查询参数和JSON请求体)。总之,url标签是Go生态中处理HTTP参数的标准方式之一。

