gconv 是 GoFrame 框架 v2 版本中的一个通用类型转换工具包,旨在简化不同数据类型之间的转换操作。它通过反射和泛型能力,提供了丰富的方法来处理基础类型、结构体、集合(如 mapslice)等复杂数据的转换需求。


📦 安装

首先确保你已经引入了 GoFrame v2:

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

之后即可导入 gconv 包:

import "github.com/gogf/gf/v2/util/gconv"

🧱 基础类型转换

gconv 支持几乎所有 Go 原生类型之间的转换,包括但不限于 string, int, float, bool, time.Time 等。

示例:基本类型转换

package main

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

func main() {
    // string -> int
    i := gconv.Int("123")
    fmt.Println(i) // 123

    // interface{} -> float64
    var x interface{} = "3.14"
    f := gconv.Float64(x)
    fmt.Println(f) // 3.14

    // string -> bool
    b := gconv.Bool("true")
    fmt.Println(b) // true

    // string -> time.Time
    t := gconv.Time("2025-04-05 12:00:00")
    fmt.Println(t) // 2025-04-05 12:00:00 +0000 UTC
}
注意:如果转换失败,gconv 会返回目标类型的零值。若需错误提示,可使用带 WithError 的方法。

🔄 高级类型转换

1. 结构体与 Map 转换

map[string]interface{} 转换为结构体

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

data := map[string]interface{}{
    "name": "Alice",
    "age":  25,
}

var user User
err := gconv.Struct(data, &user)
if err != nil {
    panic(err)
}
fmt.Printf("%+v\n", user) // {Name:Alice Age:25}

将结构体转换为 map

user := User{Name: "Bob", Age: 30}
m := gconv.Map(user)
fmt.Println(m) // map[age:30 name:Bob]

2. Slice 与 Map 切换

[]map[string]interface{}[]struct

users := []map[string]interface{}{
    {"name": "John", "age": 28},
    {"name": "Jane", "age": 32},
}

var userList []User
err := gconv.Structs(users, &userList)
// userList = [{Name:John Age:28}, {Name:Jane Age:32}]

[]struct[]map

userList := []User{
    {Name: "Tom", Age: 20},
    {Name: "Jerry", Age: 22},
}

maps := gconv.Maps(userList)
// maps = [map[name:Tom age:20] map[name:Jerry age:22]]

🔁 反射与泛型支持

gconv 内部大量使用反射和泛型技术,因此可以处理任意嵌套结构的类型转换。

示例:深层嵌套结构体转换

type Address struct {
    City string
}

type Person struct {
    Name    string
    Age     int
    Address Address
}

data := map[string]interface{}{
    "Name": "Eve",
    "Age":  35,
    "Address": map[string]interface{}{
        "City": "New York",
    },
}

var p Person
gconv.Struct(data, &p)
fmt.Printf("%+v\n", p) // {Name:Eve Age:35 Address:{City:New York}}

⚠️ 错误处理

部分转换方法提供带错误返回的变体:

val, err := gconv.Int64WithError("not a number")
if err != nil {
    fmt.Println("Conversion failed:", err)
}

可用方法包括:

  • IntWithError
  • Float64WithError
  • BoolWithError
  • TimeWithError
  • StructWithError
  • StructsWithError

🛠️ 自定义类型转换器(Type Conversion Hook)

你可以注册自定义的类型转换逻辑,适用于特殊类型或格式。

示例:自定义时间格式转换

gconv.RegisterConverter(func(v interface{}) (time.Time, error) {
    s, ok := v.(string)
    if !ok {
        return time.Time{}, fmt.Errorf("invalid type for time conversion")
    }
    return time.Parse("2006-01-02", s)
})

t := gconv.Time("2025-04-05")
fmt.Println(t) // 2025-04-05 00:00:00 +0000 UTC

📌 注意事项

  • 所有转换方法都尽量保持“零拷贝”和高效性。
  • 对于结构体字段名匹配,默认使用 JSON 标签,也可通过 gconv.SetTagName 修改标签名。
  • 转换过程中如果遇到不兼容类型,将返回零值。建议使用带 WithError 的方法进行错误处理。

📚 官方文档地址

更多 API 细节请参考官方文档:
👉 https://pkg.go.dev/github.com/gogf/gf/v2/util/gconv


✅ 总结

gconv 提供了一套强大而简洁的类型转换接口,适用于从基础类型到复杂结构体的各种转换需求。其特点包括:

  • 支持多种类型转换(基础类型、结构体、map、slice)
  • 支持嵌套结构体转换
  • 提供错误处理机制
  • 支持自定义类型转换钩子
  • 易于集成到 GoFrame 项目中

非常适合用于后端服务中对入参、数据库结果、配置文件等的统一转换处理。


每日更新-免费小火箭账号
不要错过任何机会,探索最新的应用和游戏,就在我们的平台。
立即访问
最后修改:2025 年 04 月 30 日
如果觉得我的文章对你有用,请随意赞赏