Go每日一库之一个简单、易用、安全的类型转换工具
2022-9-24 22:3:42 Author: Go语言中文网(查看原文) 阅读量:17 收藏

在使用Go编码过程中,大家一定遇到过类型转换的场景。今天就给大家介绍一个简单、易用且安全的类型转换工具:cast。以下是cast的基本档案:

cast包档案

star

2.5k

used by

74.1k

contributors

26

工具分类

效率

功能简介

在不同类型之间进行简单、安全的类型转换

应用场景:该包当初是专门为著名的web框架Hugo开发的。一般应用在将接口类型转换到一个具体的类型时,以及从YAML、JSON等若类型的配置文件中读取数据,并想转换到具体数据类型时应用。当然也可以将任意两个类型之间进行转换,比如把数值转换成字符串,将接口类型转换成布尔类型等。

基本使用:Cast库提供了如下格式的方法:ToXXXX()。该方法一定会返回特定类型的值。如果输入的参数值不能被转换成对应的类型,那么就会返回0或nil,也不会报错

Cast库还提供了ToXXXXE()格式的方法。该方法和ToXXXX()方法唯一的区别是当出错时,会把具体的错误返回给调用者。

我们看下最基本的ToString和ToInt应用示例:

ToString:

cast.ToString("mayonegg")         // "mayonegg"
cast.ToString(8) // "8"
cast.ToString(8.31) // "8.31"
cast.ToString([]byte("one time")) // "one time"
cast.ToString(nil) // ""

var foo interface{} = "one more time"
cast.ToString(foo) // "one more time"

ToInt:

cast.ToInt(8)                  // 8cast.ToInt(8.31)               // 8cast.ToInt("8")                // 8cast.ToInt(true)               // 1cast.ToInt(false)              // 0
var eight interface{} = 8cast.ToInt(eight) // 8cast.ToInt(nil) // 0

该包不仅有基础数据类型的转换,还有将一个类型转换成时间类型、map类型、boolean类型等多种功能。具体的可以详细参考该包的文档。

实现原理:该包的底层实现是基于类型判断实现的。通过类型判断选择出具体的类型,然后再根据相应的函数转换成对应的类型。比如,在该包中有ToString函数,如果是将float32类型转换成string类型,则底层依然是strconv.FormatFloat(s, 'f', -1, 64)函数来实现的。

另外,在Go中一种是类型断言,一种是类型判断。这两种的使用是有区别的。我们看下其区别。

  • 类型断言

类型断言是用来断定某个接口是否是某个具体的数据类型,形式是interface.(T),T是特定的类型。如下:

a := 10
var c interface{} = acv, ok := c.(int)fmt.Println(cv, ok) //10,true

这里需要注意的是 c 必须是接口类型。同时安全的形式是 cv, ok := c.(int)这种形式,而非cv := c.(int),否则在不是对应的类型时会报panic。如下:

cv := c.(string) //panic: interface conversion: interface {} is int, not string
  • 类型判断

类型判断判断该接口是哪种具体的类型,其使用形式是 interface.(type),这里括号中是固定的type。如下:

  switch s := c.(type) {  case string:    return s, nil  case bool:    return strconv.FormatBool(s), nil  case float64:    return strconv.FormatFloat(s, 'f', -1, 64), nil  case float32:        return strconv.FormatFloat(float64(s), 'f', -1, 32), nil

这里需要结合switch-case语句使用。如果能转换成对应的类型,则s是该类型的值。

更多项目详情请查看如下链接。

开源项目地址:https://github.com/spf13/cast

开源项目作者:spf13


推荐阅读

福利
我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651453476&idx=1&sn=e88133c806bf3b7216b60f9801f1f295&chksm=80bb26d6b7ccafc008e1945a8426de5c8bdacaacad8f056f07119d69975a932943128b6ac2c5#rd
如有侵权请联系:admin#unsafe.sh