golang,go,博客,开源,编程

golang每日一库之gconv

Updated on with 0 views and 0 comments

gconv 是一个 Go 语言的库,提供了一套高效且灵活的工具来简化不同数据类型之间的转换。

它来自于 gf(GoFrame)框架的一部分,专注于数据转换任务,特别是从 mapJSONstructslicearray 等常见数据类型之间进行转换。

这个库的核心优势是它通过类型断言机制使得类型转换变得非常简洁且高效,极大地减少了手动编写冗长代码的需求。

核心功能

1. 类型转换

gconv 提供了多种数据类型转换的支持,包括但不限于:

  • 基本数据类型(如 intfloat64string)之间的转换。

  • 结构体与 map 之间的相互转换。

  • 结构体与 JSON 的相互转换。

  • 切片与数组 之间的转换。

  • 其他自定义类型 与基础类型之间的转换。

    package main
    
    import (
        "fmt"
        "github.com/gogf/gf/v2/util/gconv"
    )
    
    func main() {
        i := 123
        fmt.Printf("%10s %v\n", "Int:",        gconv.Int(i))
        fmt.Printf("%10s %v\n", "Int8:",       gconv.Int8(i))
        fmt.Printf("%10s %v\n", "Int16:",      gconv.Int16(i))
        fmt.Printf("%10s %v\n", "Int32:",      gconv.Int32(i))
        fmt.Printf("%10s %v\n", "Int64:",      gconv.Int64(i))
        fmt.Printf("%10s %v\n", "Uint:",       gconv.Uint(i))
        fmt.Printf("%10s %v\n", "Float32:",    gconv.Float32(i))
        fmt.Printf("%10s %v\n", "Float64:",    gconv.Float64(i))
        fmt.Printf("%10s %v\n", "Bool:",       gconv.Bool(i))
        fmt.Printf("%10s %v\n", "String:",     gconv.String(i))
    }
    
    

如果仅仅是基本类型的转换,那么用cast库也很方便。这个库的特色在后面介绍。

2. 结构体与 map 转换

结构体与 map 之间的转换是 gconv 的核心功能之一。它能够根据字段名和标签来自动匹配结构体和 map 中的字段,从而简化了手动转换的工作。

示例:结构体到 map 转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    user := User{Name: "John", Age: 28}
  
    // 结构体转换成 map
    userMap := gconv.Map(user)
    fmt.Println(userMap)  // 输出: map[age:28 name:John]
}
示例:map 到结构体转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    userMap := map[string]interface{}{
        "name": "Alice",
        "age":  30,
    }

    // map 转换成结构体
    var user User
    err := gconv.Struct(userMap, &user)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
  
    fmt.Println(user)  // 输出: {Alice 30}
}

3. 结构体与 JSON 转换

gconv 支持将 JSON 字符串转换为结构体对象,或将结构体转换为 JSON 字符串。这对于 Web 开发和 API 调用非常有用。

示例:JSON 到结构体转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name": "Bob", "age": 25}`
  
    // JSON 转换成结构体
    var user User
    err := gconv.StructJson([]byte(jsonStr), &user)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
  
    fmt.Println(user)  // 输出: {Bob 25}
}
示例:结构体到 JSON 转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    user := User{Name: "Eve", Age: 22}
  
    // 结构体转换成 JSON
    jsonStr, err := gconv.Json(user)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
  
    fmt.Println(string(jsonStr))  // 输出: {"name":"Eve","age":22}
}

4. 支持切片与数组之间的转换

gconv 也支持切片和数组的相互转换,可以将一个类型的切片转换为另一个类型的切片或数组。

示例:切片到结构体数组转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    usersSlice := []map[string]interface{}{
        {"name": "Tom", "age": 30},
        {"name": "Jerry", "age": 25},
    }
  
    // map 切片 转换成 结构体 切片
    var users []User
    err := gconv.Structs(usersSlice, &users)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
  
    fmt.Println(users)  // 输出: [{Tom 30} {Jerry 25}]
}

5. 支持自定义类型与基础类型转换

gconv 还支持自定义类型与基础数据类型之间的相互转换。例如,您可以将 string 类型转换为自定义的结构体类型。

示例:自定义类型转换
package main

import (
    "fmt"
    "github.com/gogf/gf/v2/util/gconv"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    // 字符串转换为结构体
    userStr := `{"name":"Alice", "age":30}`
    var user User
    err := gconv.StructJson([]byte(userStr), &user)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
  
    fmt.Println(user)  // 输出: {Alice 30}
}

性能

gconv 的性能表现相当优异。它使用了 Go 语言的类型断言机制来自动推导类型转换,减少了编写复杂转换逻辑的需求。

同时,由于它是 GoFrame 框架的一部分,设计时考虑到了高效性,特别适合需要处理大量数据的场景。即使在高并发环境下,gconv 也能够保持较好的性能。

错误处理与类型匹配

在数据转换过程中,如果源数据与目标类型不匹配,gconv 会返回错误。

这可以帮助开发者快速定位问题,避免类型错误导致的程序崩溃。

安装

安装 gconv 非常简单,您只需要执行以下命令:

go get github.com/gogf/gf/v2/util/gconv

最后

gconv 是一个功能强大且高效的 Go 库,专门用于不同数据类型之间的转换。它的优势在于:

  • 自动类型推导,简化了转换操作。
  • 支持结构体与 mapJSON、切片、数组等类型之间的相互转换。
  • 高性能且易于使用,适合处理各种类型的数据转换任务。

标题:golang每日一库之gconv
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/04/07/1743987204778.html
联系:scotttu@163.com