golang安全高效的类型转换插件库cvt的使用
Golang安全高效的类型转换插件库cvt的使用
简介
cvt是一个简单、安全的类型转换库,支持任何类型的转换,包括间接/自定义类型。
安装
要求Go版本 >= 1.13
go get -u github.com/shockerli/cvt
使用示例
带错误处理的方法
使用__E()
方法:当无法转换时会返回错误
cvt.IntE("12") // 12, nil
cvt.Float64E("12.34") // 12.34, nil
cvt.StringE(12.34) // "12.34", nil
cvt.BoolE("false") // false, nil
自定义类型和指针
支持解引用指针并获取原始类型
type Name string
var name Name = "jioby"
cvt.StringE(name) // jioby, nil
cvt.StringE(&name) // jioby, nil
忽略错误的方法
使用__()
方法:忽略错误,转换失败时返回该类型的零值
cvt.Int("12") // 12(success)
cvt.Int(struct{}{}) // 0(failed)
带默认值的方法
转换失败时返回默认值
cvt.Int(struct{}{}, 12) // 12
cvt.Float("hello", 12.34) // 12.34
更多功能
该库包含1000+单元测试用例,更多示例可以参考*_test.go
文件。
完整示例Demo
package main
import (
"fmt"
"github.com/shockerli/cvt"
)
type Name string
func main() {
// 基本类型转换
num, err := cvt.IntE("123")
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println("转换成功:", num) // 123
}
// 自定义类型
var name Name = "Alice"
str := cvt.String(name)
fmt.Println("自定义类型转换:", str) // Alice
// 指针类型
ptr := &name
str = cvt.String(ptr)
fmt.Println("指针类型转换:", str) // Alice
// 带默认值的转换
val := cvt.Int("invalid", 100)
fmt.Println("带默认值转换:", val) // 100
// 忽略错误的转换
val = cvt.Int("456")
fmt.Println("忽略错误转换:", val) // 456
// 浮点数转换
f := cvt.Float64("3.14")
fmt.Println("浮点数转换:", f) // 3.14
// 布尔值转换
b := cvt.Bool("true")
fmt.Println("布尔值转换:", b) // true
}
许可证
该项目使用MIT许可证。
cvt库提供了安全高效的类型转换功能,能够处理各种常见和自定义类型的转换需求,是Golang开发中处理类型转换问题的好帮手。
更多关于golang安全高效的类型转换插件库cvt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang安全高效的类型转换插件库cvt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang安全高效的类型转换插件库cvt使用指南
cvt是一个专注于安全高效类型转换的Golang库,它提供了简单易用的API来处理各种类型之间的转换,避免了手动转换可能带来的错误和panic风险。
安装cvt
go get github.com/docker/go/cvt
基本功能
1. 基础类型转换
package main
import (
"fmt"
"github.com/docker/go/cvt"
)
func main() {
// 字符串转整型
num, err := cvt.Int("123")
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println("转换结果:", num) // 输出: 123
}
// 浮点数转字符串
str := cvt.String(3.14)
fmt.Println(str) // 输出: "3.14"
// 接口{}转bool
b, err := cvt.Bool("true")
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println(b) // 输出: true
}
}
2. 切片类型转换
func sliceExample() {
// 字符串切片转整型切片
strSlice := []string{"1", "2", "3"}
intSlice, err := cvt.ToIntSlice(strSlice)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Printf("%v (%T)\n", intSlice, intSlice) // 输出: [1 2 3] ([]int)
}
// 接口切片转字符串切片
ifaceSlice := []interface{}{1, "two", 3.0}
strSlice = cvt.ToStringSlice(ifaceSlice)
fmt.Println(strSlice) // 输出: [1 two 3]
}
3. Map类型转换
func mapExample() {
// map[string]string 转 map[string]int
strMap := map[string]string{
"a": "1",
"b": "2",
}
intMap, err := cvt.ToIntMap(strMap)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Println(intMap) // 输出: map[a:1 b:2]
}
// 任意map转map[string]string
anyMap := map[interface{}]interface{}{
"name": "Alice",
"age": 30,
"score": 95.5,
}
strMap = cvt.ToStringMap(anyMap)
fmt.Println(strMap) // 输出: map[age:30 name:Alice score:95.5]
}
高级功能
1. 自定义转换规则
type Person struct {
Name string
Age int
}
func customExample() {
// 从map创建结构体
data := map[string]interface{}{
"Name": "Bob",
"Age": "25", // 注意这里是字符串
}
var p Person
err := cvt.ConvertToStruct(data, &p)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Printf("%+v\n", p) // 输出: {Name:Bob Age:25}
}
}
2. 处理JSON数据
func jsonExample() {
jsonStr := `{"name":"Charlie","age":"40","active":"true"}`
// 直接解析JSON到map
var result map[string]interface{}
err := cvt.JSONToMap(jsonStr, &result)
if err != nil {
fmt.Println("JSON解析失败:", err)
return
}
// 自动转换JSON中的字符串值
age, _ := cvt.Int(result["age"])
active, _ := cvt.Bool(result["active"])
fmt.Println("年龄:", age) // 输出: 40
fmt.Println("活跃:", active) // 输出: true
}
性能优化技巧
- 复用转换器实例:对于频繁转换的场景,可以创建并复用Converter实例
func converterExample() {
converter := cvt.NewConverter()
// 复用转换器
v1, _ := converter.ToInt("123")
v2, _ := converter.ToFloat("3.14")
fmt.Println(v1, v2)
}
-
批量转换:使用Slice和Map转换方法减少循环和错误检查代码
-
错误处理策略:根据场景选择严格检查或宽松转换
// 严格模式 - 会返回错误
value, err := cvt.Int("abc")
// 宽松模式 - 返回零值
value := cvt.IntDefault("abc", 0)
最佳实践
- 总是处理可能返回的错误
- 对于不确定的输入,先使用
CanConvert
方法检查 - 在性能敏感区域复用Converter实例
- 对于复杂结构,考虑实现自定义的转换逻辑
cvt库通过提供一组安全、易用的API,大大简化了Golang中的类型转换工作,同时避免了因类型不匹配导致的运行时panic,是处理数据转换的强大工具。