Go如何使用struct结构体的tar属性

我们来简单说明一下,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的公有属性(首字母大写)和私有属性(首字母小写)。

希望对大家有帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容