我们来简单说明一下,GO如何使用Struct结构体tar属性,接下来我通过一个简单的列子来说明。
首先我们声明一个用户的结构体
//创建message结构体
type User struct {
Name string `json:"name"`
Age int `json:"age" validate:"1-100"`
Sex string `json:"sex"`
}
简单的对结构体做个说明,里面有三个属性分别是Name、Age、Sex,在Go语言里面定义tag的语法“``”,json和validate就是声明的tar
我们一般在开发中常用就是json和结构体之间的转换,首先我们来看将结构体转换为json字符串,代码实例如下:
func main() {
user := User{
Name: "Bon",
Age: 101,
Sex: "男",
}
json,err := json.Marshal(user)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(json))
}
结构体转换为对应的json,就是通过struct的tar“json”进行映射,返回对应的值,我们使用go里面json的Marshal方法
接下来我们来说明将josn转化为struct类型,代码如下:
func main() {
jsonString := "{\"name\":\"bob\",\"age\":18,\"sex\":\"男\"}"
user := User{}
err := json.Unmarshal([]byte(jsonString), &user)
if err != nil {
fmt.Println(err)
}
}
我们将json字符串转换为对应的结构体,是通过json的Unmarshal方法,这种方法也是通过tar“json”来映射
还有一种tar很好用的用法,就是添加自定义的tar,如果我们之前用过PHP的Laravel或者ThinkPHP5框架,这两个框架都有对上传的字段进行验证validate,同样GO语言通过tar也可以实现这个用法,代码如下:
//user结构体对age进行验证,年龄在1-100之间满足上传的要求,否则不满足,这里我们通过Go的反射对象(reflect)进行实现
func (u *User) AgeValidate() bool {
userReflect := reflect.ValueOf(*u)
tag := userReflect.Type().Field(1).Tag.Get("validate")
val := userReflect.Field(1).Interface().(int)
result := strings.Split(tag,"-")
min,_ := strconv.Atoi(result[0])
max,_ := strconv.Atoi(result[1])
if val > min && val < max {
return true
}
return false
}
//主函数
func main() {
user := User{
Name: "Bon",
Age: 101,
Sex: "男",
}
if result := user.AgeValidate(); result{ //用户年龄的验证
json,err := json.Marshal(user)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(json))
}else {
fmt.Println("年龄异常")
}
}
这里的属性验证我们是通过Go的反射(reflect)对象进行实现
和映射权限有关的用法,我们对结构体属性首字母大小写是有差别的,同时这也会影响tar里面的映射,代码如下:
//创建message结构体
type User struct {
Name string `json:"name"`
Age int `json:"age" validate:"1-100"`
sex string `json:"sex"`
}
func main() {
jsonString := "{\"name\":\"bob\",\"age\":18,\"sex\":\"男\"}"
user := User{}
err := json.Unmarshal([]byte(jsonString), &user)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%v",user)
}
运行结果:
{bob 18 }
如果对结构体进行私有属性设置,这会使tar映射不到,我们json定义了三个属性name、age、sex,分别对应结构体的Name、Age、sex,sex是私有属性,所以映射不到,同样也适用于结构体反转成json。
总结:如果结构体声明的属性,首字母没有大写,这样是映射不到的,这里类似于GO的公有属性(首字母大写)和私有属性(首字母小写)。
希望对大家有帮助。