GoFrame 的 gconv 模块是一个功能强大的类型转换工具,它能够将任何类型的变量转换成其他指定的类型。以下是 gconv 模块的一些常用用法:
1. 基本类型转换: gconv 提供了多种基本数据类型之间的转换功能,例如 Int , Uint , Float32 , Float64 , Bool , String , Bytes 等 。
2. Slice 类型转换:可以轻松地将变量转换成 slice 类型,如 Bytes , Ints , Floats , Strings , Interfaces 。
3. 时间类型转换: gconv 支持将变量转换为 time.Time 对象,如果变量是可解析的日期字符串,可以使用 Time 函数进行转换 。
4. Map 转换:可以将 map、struct 或 *struct 类型的变量转换为 map[string]interface{} 类型,如果变量不是这些类型之一,则转换失败并返回 nil。转换 struct 时,可以使用特定的标签来指定最优先的标签,如果没有指定,则按照 gconv 、 json 、字段名称的顺序检测标签 。
5. Struct 转换: gconv 可以将 map 或 slice 映射转换为 struct 对象。在转换过程中,可以使用 Struct 方法,并且可以指定自定义的参数名称到属性名称的映射关系 。
6. 类型名称转换: Convert 函数可以根据提供的类型名称将变量转换为相应的 Go 基本类型 。
7. 自定义规则:在处理 struct 转换时,可以使用特定的 tag 来指定参数名称,例如 p:"password1" 可以将参数 password1 映射到 Pass1 属性上 。
8. 复杂参数处理: gconv 支持智能的参数类型解析,不区分请求提交方式及请求提交类型,能够处理包括 JSON/XML 在内的复杂参数 。
gconv 模块由于内部大量使用了断言而非反射(仅在 struct 转换时使用了反射),因此执行效率非常高,适合在项目中进行数据类型转换,特别是在 JSON/XML 等数据解析时提供更高的灵活度 。
GoFrame 的 gconv 模块提供了丰富的类型转换功能,以下是一些 gconv 的使用案例:
基本类型转换
假设我们有一个整数值,我们可以将其转换为不同的基本数据类型:
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))
}
Slice 类型转换
将一个基本数据类型的 slice 转换为其他类型的 slice:
// 将整数数组转换为浮点数数组
intArray := []int{1, 2, 3, 4}
floatArray := gconv.Floats(intArray)
fmt.Println(floatArray)
Map 转换
将结构体或 map 转换为 map[string]interface{} :
type User struct {
Name string
Age int
}
user := User{Name: "John", Age: 30}
// 转换为 map
userInfo := gconv.Map(user)
fmt.Println(userInfo)
Struct 转换
将 map 转换为结构体:
type User struct {
Name string
Age int
}
userMap := map[string]interface{}{
"Name": "John",
"Age": 30,
}
var user User
if err := gconv.Struct(userMap, &user); err != nil {
fmt.Println("转换错误:", err)
}
fmt.Println(user)
时间类型转换
将字符串转换为 time.Time 对象:
timeStr := "2021-01-02 15:04:05"
timeObj, err := gconv.Time(timeStr)
if err != nil {
fmt.Println("时间转换错误:", err)
}
fmt.Println(timeObj)
类型名称转换
将变量转换为指定的 Go 基本类型名称:
var age interface{} = 25
convertedAge, err := gconv.Convert(age, "int")
if err != nil {
fmt.Println("转换错误:", err)
}
fmt.Println(convertedAge)
请注意,上述代码示例需要在 GoFrame 的环境中运行,确保已经导入了 GoFrame 的 gconv 模块。这些示例展示了 gconv 模块在不同场景下的应用,包括基本数据类型转换、slice 转换、map 和结构体转换,以及时间类型转换等。