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
}

性能优化技巧

  1. 复用转换器实例:对于频繁转换的场景,可以创建并复用Converter实例
func converterExample() {
	converter := cvt.NewConverter()
	
	// 复用转换器
	v1, _ := converter.ToInt("123")
	v2, _ := converter.ToFloat("3.14")
	
	fmt.Println(v1, v2)
}
  1. 批量转换:使用Slice和Map转换方法减少循环和错误检查代码

  2. 错误处理策略:根据场景选择严格检查或宽松转换

// 严格模式 - 会返回错误
value, err := cvt.Int("abc")

// 宽松模式 - 返回零值
value := cvt.IntDefault("abc", 0)

最佳实践

  1. 总是处理可能返回的错误
  2. 对于不确定的输入,先使用CanConvert方法检查
  3. 在性能敏感区域复用Converter实例
  4. 对于复杂结构,考虑实现自定义的转换逻辑

cvt库通过提供一组安全、易用的API,大大简化了Golang中的类型转换工作,同时避免了因类型不匹配导致的运行时panic,是处理数据转换的强大工具。

回到顶部