• Go 格式转换


    string、int、int64相互转换

    #string到int
    int,err:=strconv.Atoi(string)
    
    #string到int64
    int64, err := strconv.ParseInt(string, 10, 64)
    
    #int到string
    string:=strconv.Itoa(int)
    
    #int64到string
    string:=strconv.FormatInt(int64,10)
    

    string、[]byte转换

    string转[]byte

    var str string = "test"
    
    var data []byte = []byte(str)
    

    []byte转string

    var data [10]byte 
    
    byte[0] = 'T'
    
    byte[1] = 'E'
    
    var str string = string(data[:])
    

    struct转map

    使用json模块

    直接使用json.Marshal方法来强制转化struct。

    func JSONMethod(content interface{}) map[string]interface{} {
        var name map[string]interface{}
        if marshalContent, err := json.Marshal(content); err != nil {
            fmt.Println(err)
        } else {
            d := json.NewDecoder(bytes.NewReader(marshalContent))
            d.UseNumber() // 设置将float64转为一个number
            if err := d.Decode(&name); err != nil {
                fmt.Println(err)
            } else {
                for k, v := range name {
                    name[k] = v
                }
            }
        }
        return name
    }
    

    使用reflect

    通过reflect模块来获取结构体的key值和value值,然后直接进行组装。这种方法不能识别结构体中的tag,所以无法兼容首字母小写,而其他字母存在大写的情况.

    func ReflectMethod(obj interface{}) map[string]interface{} {
        t := reflect.TypeOf(obj)
        v := reflect.ValueOf(obj)
    
        var data = make(map[string]interface{})
        for i := 0; i < t.NumField(); i++ {
            data[strings.ToLower(t.Field(i).Name)] = v.Field(i).Interface()
        }
        return data
    }
    

    使用第三方库

    github.com/fatih/structs,他提供了比较丰富的函数,让我们可以像python中一样轻松的获取所有的key值(structs.Names(server)),所有的value值(structs.Values(server)),甚至直接进行类型判断(structs.IsZero(server))等等。

    更详细的信息可以查阅:https://github.com/fatih/structs

    type Human struct {
        Name     string `json:"name"`
        Age      int    `json:"age"`
        Profile  string `structs:"profile"`
        IsGopher bool   `json:"isGopher"`
    }
    
    func main() {
        human := Human{"Detector", 18, "A tester", true}
        fmt.Println("Json method:", JSONMethod(human))
        fmt.Println("========")
        fmt.Println("Reflect method:", ReflectMethod(human))
        fmt.Println("========")
        fmt.Println("Third lb:", structs.Map(human))
    }
    

    从测试结果可以看到,三种方式都能完成struct转map,但是reflect方法无法识别结构体中的tag,第三方库只能使用tag structs,所以如果考虑兼容性(考虑到协同开发)和尽量使用官方库的原则,推荐使用第一种方法(json转换)

  • 相关阅读:
    OpenCV里面的一些常用函数
    c++ 里面的字符类型转换
    互斥研究
    git 命令
    pipe的操作
    二叉树总结(五)伸展树、B-树和B+树
    二叉树总结(四)平衡二叉树
    二叉树总结(三)二叉搜索树
    [LeetCode]Construct Binary Tree from Preorder and Inorder Traversal
    二叉树总结(一)概念和性质
  • 原文地址:https://www.cnblogs.com/followyou/p/12194128.html
Copyright © 2020-2023  润新知