ZBLOG

golang自定义字段,结构体补充及自定义验证

Golang 中的结构体是一种自定义类型,可以包含多个字段。在实际应用中,有时需要自定义某些字段或者为结构体添加额外的功能。本文将介绍 Golang 中如何自定义字段、补充结构体以及自定义验证。

自定义字段

在 Golang 中,我们可以通过以下方式来自定义结构体的字段:

type User struct {
    ID        int
    Name      string
    Email     string
    Password  string `json:"-"`
}

在上述示例中,我们为 User 结构体添加了四个字段,其中 Password 字段使用了特殊标记 -,表示该字段不会被序列化成 JSON 格式(即忽略该字段)。这种方法适用于需要保护敏感信息的场景。

除此之外,还可以通过添加方法来扩展结构体的功能。例如:

type User struct {
    ID        int
    Name      string
}

func (u *User) Hello() {
    fmt.Printf("Hello, I'm %s (ID=%d)\n", u.Name, u.ID)
}

在上述示例中,我们为 User 结构体添加了一个 Hello() 方法,并在该方法中输出用户名称和 ID。此时,在创建 User 实例后即可直接调用该方法进行操作:

user := User{ID: 1, Name: "Tom"}
user.Hello()  // 输出 "Hello, I'm Tom (ID=1)"

结构体补充

在实际应用中,我们有时需要对已经定义的结构体进行扩展或者修改。这时可以使用匿名结构体来实现结构体的补充。

示例代码如下:

type User struct {
    ID        int
    Name      string
}

type Customer struct {
    User
    Email     string
}

func main() {
    customer := Customer{
        User:  User{ID: 1, Name: "Tom"},
        Email: "tom@example.com",
    }
    
    fmt.Println(customer.ID)   // 输出 1
}

在上述示例中,我们定义了两个结构体:UserCustomer。其中,Customer 结构体嵌入了一个匿名结构体 User,表示它继承了 User 结构体的所有字段和方法。因此,在创建 Customer 实例后,即可直接访问 User 中的字段和方法。

自定义验证

在 Golang 中,可以使用第三方库如 go-playground/validator.v10 来实现自定义验证。该库提供了丰富的标准验证器(如 required, min, max, email 等),同时还支持自定义验证器。

例如,假设我们需要验证一个字符串是否为某个固定值,则可以通过自定义标签来实现:

import (
	"errors"
	"fmt"
	"reflect"
	
	"github.com/go-playground/validator/v10"
)

type FixedValueValidator struct {
	FixedValue string
}

func (v *FixedValueValidator) Validate(fl validator.FieldLevel) bool {
	return fl.Field().String() == v.FixedValue
}

func (v *FixedValueValidator) Register(tagName string, validate *validator.Validate) error {
	validate.RegisterValidation(tagName, v.Validate)
	return nil
}

type MyStruct struct {
	Value string `validate:"fixed=hello"`
}

func main() {
	my := MyStruct{Value: "hello"}
	
	validate := validator.New()
	err := validate.RegisterValidation("fixed", (&FixedValueValidator{}).Register)
	if err != nil {
		panic(err)
	}
	
	if err := validate.Struct(my); err != nil {
		for _, e := range err.(validator.ValidationErrors) {
			fmt.Println(e.Namespace(), e.Tag(), e.Param(), e.Value())
		}
		
		panic(errors.New("validation failed"))
	}
	
	fmt.Println("validation passed")
}

在上述示例中,我们定义了一个 FixedValueValidator 结构体,并实现了 ValidateRegister 方法。其中,Validate 方法用于验证给定的字段值是否等于固定值;Register 方法用于注册该自定义标签。

接着,在结构体中添加了一个名为 Value 的字段,并使用 fixed=hello 标签进行自定义验证。最后,通过调用 validate.Struct() 方法来对结构体进行验证。如果验证失败,则会输出错误信息并抛出异常;否则会输出 “validation passed” 并继续执行程序。

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?