ZBLOG

golang struct binding

Golang Struct Binding 详解

在 Go 语言中,struct binding(结构体绑定)通常指的是将外部数据(如 JSON、表单数据、数据库查询结果等)映射到结构体的过程。以下是几种常见的 struct binding 场景:

1. JSON 绑定

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name     string `json:"name"`
	Age      int    `json:"age"`
	Email    string `json:"email,omitempty"`
	Password string `json:"-"` // 忽略该字段
}

func main() {
	// JSON 反序列化到结构体
	data := []byte(`{"name":"Alice","age":25}`)
	var user User
	err := json.Unmarshal(data, &user)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Printf("%+v\n", user) // {Name:Alice Age:25 Email: Password:}

	// 结构体序列化为 JSON
	newUser := User{Name: "Bob", Age: 30, Password: "secret"}
	jsonData, err := json.Marshal(newUser)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(string(jsonData)) // {"name":"Bob","age":30}
}

2. Form/Query 参数绑定 (Gin Web框架示例)

package main

import (
	"github.com/gin-gonic/gin"
)

type LoginForm struct {
	Username string `form:"username" binding:"required"`
	Password string `form:"password" binding:"required,min=6"`
}

func main() {
	r := gin.Default()

	r.POST("/login", func(c *gin.Context) {
		var form LoginForm
		
        // ShouldBind会自动根据Content-Type选择绑定方式
        if err := c.ShouldBind(&form); err != nil {
			c.JSON(400, gin.H{"error": err.Error()})
			return
        }
        
        c.JSON(200, gin.H{
            "username": form.Username,
            "status":   "logged in",
        })
    })

	r.Run(":8080")
}

3. ORM Model Binding (GORM示例)

package main

import (
    "gorm.io/gorm"
    "gorm.io/driver/sqlite"
)

type Product struct {
    gorm.Model        // 内嵌gorm.Model,包含ID、CreatedAt等字段
    Code       string `gorm:"uniqueIndex;size:255"`
    Price      uint   `gorm:"default:100"`
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // Auto Migrate会根据struct创建表或修改表结构
    db.AutoMigrate(&Product{})

    // Create - 插入记录时自动绑定到struct字段
    db.Create(&Product{Code: "D42", Price: 200})

    // Read - 查询结果自动绑定到struct实例上
    var product Product
    
	db.First(&product, "code = ?", "D42") 
    
	var result struct { 
	    Code string 
	    Total uint 
	  } 
	db.Model(&Product{}).Select("code, sum(price) as total").Group("code").Scan(&result)
}

Tag语法说明

Go中的struct tag使用反引号”包围,格式为:

`key1:"value1" key2:"value2" ...`

常见tag用途:

  • JSON处理json:"field_name,omitempty"
  • 表单验证binding:"required,max=10"
  • 数据库映射gorm:"column:custom_name;type:varchar(100)"
  • XML处理xml:"name,attr"

如果需要更复杂的binding操作,可以考虑使用第三方库如:

  • validator - 用于数据验证的tag系统


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23776

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?