golang,go,博客,开源,编程
gconv
是一个 Go 语言的库,提供了一套高效且灵活的工具来简化不同数据类型之间的转换。
它来自于 gf
(GoFrame)框架的一部分,专注于数据转换任务,特别是从 map
、JSON
、struct
、slice
、array
等常见数据类型之间进行转换。
这个库的核心优势是它通过类型断言机制使得类型转换变得非常简洁且高效,极大地减少了手动编写冗长代码的需求。
gconv
提供了多种数据类型转换的支持,包括但不限于:
基本数据类型(如 int
、float64
、string
)之间的转换。
结构体与 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库也很方便。这个库的特色在后面介绍。
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}
}
gconv
支持将 JSON 字符串转换为结构体对象,或将结构体转换为 JSON 字符串。这对于 Web 开发和 API 调用非常有用。
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}
}
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}
}
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}]
}
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 库,专门用于不同数据类型之间的转换。它的优势在于:
map
、JSON
、切片、数组等类型之间的相互转换。