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

5 回复

是的

更多关于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参数的标准方式之一。

回到顶部