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)
	}
}

性能建议

  1. 对于频繁使用的转换,考虑注册自定义转换器以提高性能
  2. 在确定转换会成功时使用 MustConvert 避免错误检查
  3. 避免在循环中进行复杂的类型转换

总结

go-convert 提供了简单直观的 API 来处理 Go 中的各种类型转换需求。它的主要特点包括:

  • 类型安全的转换
  • 支持基本类型和自定义类型
  • 良好的错误处理机制
  • 简洁的 API 设计

通过合理使用这个库,可以大大简化 Go 项目中的类型转换代码,提高开发效率和代码可读性。

完整示例代码可以查看官方文档:https://github.com/shopspring/go-convert

回到顶部