golang类型转换工具插件库go-convert的使用
Golang类型转换工具插件库go-convert的使用
go-convert是一个用于将一个值转换为另一种类型的Golang库。
安装
go get -u github.com/Eun/go-convert
基本用法
package main
import (
"fmt"
"github.com/Eun/go-convert"
)
func main() {
// 将int转换为string
var s string
convert.MustConvert(1, &s)
fmt.Printf("%s\n", s)
// 将map转换为struct
type User struct {
ID int
Name string
}
var u User
convert.MustConvert(map[string]string{
"Name": "Joe",
"ID": "10",
}, &u)
fmt.Printf("%#v\n", u)
// 将Id转换为int,Groups转换为[]int,并保留其余字段
m := map[string]interface{}{
"Id": 0,
"Groups": []int{},
}
// 将map转换为定义良好的map
convert.MustConvert(
map[string]interface{}{
"Id": "1",
"Name": "Joe",
"Groups": []string{"3", "6"},
"Country": "US",
},
&m,
)
fmt.Printf("%v\n", m)
// 将interface切片转换为定义良好的interface切片
// 第一个元素转为整数,第二个转为字符串,第三个转为浮点数
sl := []interface{}{0, "", 0.0}
convert.MustConvert([]string{"1", "2", "3"}, &sl)
fmt.Printf("%v\n", sl)
}
配方系统
go-convert使用配方系统来定义如何以及哪些类型应该转换为哪种类型。许多配方已经内置,但你可以添加自己的配方或覆盖内置的配方。
package main
import (
"fmt"
"strings"
"github.com/Eun/go-convert"
)
type Roles struct {
IsAdmin bool
IsDeveloper bool
}
type User struct {
ID int
Name string
Roles Roles
}
func main() {
// 这是我们要转换的数据
data := map[string]string{
"id": "10",
"Name": "Joe",
"roles": "AD", // 这个用户是管理员(A)和开发者(D)
}
// 创建一个转换器
conv := convert.New(convert.Options{
Recipes: convert.MustMakeRecipes(
// 将string转换为Roles
func(_ convert.Converter, in string, out *Roles) error {
(*out).IsAdmin = false
(*out).IsDeveloper = false
if strings.Contains(in, "A") {
(*out).IsAdmin = true
}
if strings.Contains(in, "D") {
(*out).IsDeveloper = true
}
return nil
},
),
})
var user User
conv.MustConvert(data, &user)
// user现在是一个User实例
fmt.Printf("%#v\n", user)
}
添加内联配方
你也可以通过实现ConvertRecipes() []Recipe
函数来内联添加配方。
package main
import (
"fmt"
"strings"
"github.com/Eun/go-convert"
)
type Roles struct {
IsAdmin bool
IsDeveloper bool
}
type User struct {
ID int
Name string
Roles Roles
}
func (user *User) ConvertRecipes() []convert.Recipe {
return convert.MustMakeRecipes(
// 将string转换为Roles
func(_ convert.Converter, in string, out *Roles) error {
out.IsAdmin = false
out.IsDeveloper = false
if strings.Contains(in, "A") {
out.IsAdmin = true
}
if strings.Contains(in, "D") {
out.IsDeveloper = true
}
return nil
},
)
}
func main() {
// 这是我们要转换的数据
data := []map[string]string{
{
"id": "10",
"Name": "Joe",
"roles": "AD", // 这个用户是管理员(A)和开发者(D)
},
{
"id": "21",
"Name": "Alice",
"roles": "D", // 这个用户是开发者(D)
},
}
var users []User
convert.MustConvert(data, &users)
// users现在是一个[]User实例
fmt.Printf("%#v\n", users)
}
注意事项
这个库使用了反射,所以在某些用例中可能会比较慢。
更多关于golang类型转换工具插件库go-convert的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang类型转换工具插件库go-convert的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-convert 类型转换工具库使用指南
go-convert 是一个简单高效的 Go 语言类型转换工具库,它提供了各种基本类型之间的便捷转换方法。下面我将详细介绍其使用方法并给出示例代码。
安装
go get github.com/shopspring/go-convert
基本功能
go-convert 提供了以下主要功能:
- 基本类型之间的转换 (int, float, string 等)
- 指针类型和非指针类型的转换
- 自定义类型转换
- 错误处理
使用示例
1. 基本类型转换
package main
import (
"fmt"
"github.com/shopspring/go-convert"
)
func main() {
// 字符串转整数
var str string = "123"
num, err := convert.Convert[int](str)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Printf("字符串 '%s' 转换为整数: %d\n", str, num)
}
// 整数转浮点数
var i int = 42
f, err := convert.Convert[float64](i)
fmt.Printf("整数 %d 转换为浮点数: %.2f\n", i, f)
// 浮点数转字符串
var pi float64 = 3.14159
s := convert.MustConvert[string](pi)
fmt.Printf("浮点数 %.5f 转换为字符串: '%s'\n", pi, s)
}
2. 指针类型转换
func pointerConversion() {
// 非指针转指针
val := 100
ptr := convert.MustConvert[*int](val)
fmt.Printf("值 %d 转换为指针: %d\n", val, *ptr)
// 指针转非指针
valBack := convert.MustConvert[int](ptr)
fmt.Printf("指针 %d 转换回值: %d\n", *ptr, valBack)
}
3. 自定义类型转换
type Celsius float64
type Fahrenheit float64
func customConversion() {
// 注册自定义转换器
convert.RegisterConverter(Celsius(0), Fahrenheit(0), func(c Celsius) (Fahrenheit, error) {
return Fahrenheit(c*9/5 + 32), nil
})
var tempC Celsius = 100
tempF, err := convert.Convert[Fahrenheit](tempC)
if err != nil {
fmt.Println("温度转换失败:", err)
} else {
fmt.Printf("%.2f°C = %.2f°F\n", tempC, tempF)
}
}
4. 错误处理
func errorHandling() {
// 无效转换
invalidStr := "not a number"
_, err := convert.Convert[int](invalidStr)
if err != nil {
fmt.Printf("'%s' 转换为整数失败: %v\n", invalidStr, err)
}
// 使用 MustConvert 会 panic
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到 panic:", r)
}
}()
_ = convert.MustConvert[int](invalidStr)
}
高级用法
1. 批量转换
func batchConversion() {
// 字符串切片转整数切片
strs := []string{"1", "2", "3"}
nums, err := convert.Convert[[]int](strs)
if err != nil {
fmt.Println("批量转换失败:", err)
} else {
fmt.Printf("字符串切片 %v 转换为整数切片: %v\n", strs, nums)
}
}
2. 默认值设置
func defaultValue() {
// 转换失败时返回默认值
var result int
err := convert.ConvertTo(&result, "invalid", 42) // 使用42作为默认值
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println("转换结果(使用默认值):", result)
}
}
性能建议
- 对于频繁使用的转换,考虑注册自定义转换器以提高性能
- 在确定转换会成功时使用 MustConvert 避免错误检查
- 避免在循环中进行复杂的类型转换
总结
go-convert 提供了简单直观的 API 来处理 Go 中的各种类型转换需求。它的主要特点包括:
- 类型安全的转换
- 支持基本类型和自定义类型
- 良好的错误处理机制
- 简洁的 API 设计
通过合理使用这个库,可以大大简化 Go 项目中的类型转换代码,提高开发效率和代码可读性。
完整示例代码可以查看官方文档:https://github.com/shopspring/go-convert