Go 类型转换神器 cast库

VSole2022-08-02 10:48:20

什么是 cast?

cast 用于一致且简单的方式在不同的 go 类型之间进行安全的转换。

为什么使用 cast? 

在 Go 程序中,我们通常需要将数据由一种类型转换为另一种类型。

cast 使用一致且简单的方式来提供安全的类型转换。它不仅仅适用于类型断言,更强大的功能在于我们使用接口来处理动态数据的时候,cast 提供了一种简单的方法将接口优雅的转换为我们需要的数据类型。

使用 cast 将会极大的增加我们的开发效率,因为它本身就是为了开源项目 Hugo 而生。

使用 Go 标准库进行类型转换的痛点 

在实际开发中我们往往需要对一些常用的数据类型进行转换,如 string,int,int64,float等数据类型。

标准库 strconv 提供了字符串与基本数据类型之间的转换功能,我们也可以使用fmt.Sprintf函数进行转换。

但是往往使用起来不够直观,且当数据类型为接口时,若需要转换成需要的数据类型较为繁琐。

快速使用 cast 

安装cast

go get github.com/spf13/cast

入门案例

cast.ToString("gocn")            // "gocn"
cast.ToString(8)                  // "8"
cast.ToString(8.31)               // "8.31"
cast.ToString([]byte("gocn"))    // "gocn"
cast.ToString(nil)                // ""
var foo interface{} = "I love gocn"
cast.ToString(foo)                // "I love gocn"
cast.ToInt(8)                  // 8
cast.ToInt(8.31)               // 8
cast.ToInt("8")                // 8
cast.ToInt(true)               // 1
cast.ToInt(false)              // 0
var eight interface{} = 8
cast.ToInt(eight)              // 8
cast.ToInt(nil)                // 0

cast 实现了多种常见类型之间的相互转换,并返回最符合直觉的结果。如:

  • nil 转 string 的结果为 ""
  • true 转 string 的结果为 "true",true 转 int 的结果为 1
  • interface{} 转为其他类型,要看它里面存储的值类型

这些类型包括了:

  • 基本类型:整形,浮点型,布尔类型,字符串
  • 空接口:interface{}
  • nil
  • 时间:time.Time
  • 时间段:time.Duration
  • 切片类型:[]Type
  • map[string]Type

使用起来非常的丝滑。

进阶使用

cast提供了两组函数:

  • toType,将参数转换为 Type 类型。若转换失败,则返回 Type 类型的零值
  • ToTypeE,返回转换后的值和 error

时间和时间段的转换

代码如下:

package main
import (
 "time"
 "github.com/spf13/cast"
)
func main() {
 timeStamp := time.Now().Unix()   //1617975806
 cast.ToTime(timeStamp)           //2021-04-09 21:43:26 +0800 CST
    
 timeStr := "2021-04-09 21:43:26"
 cast.ToTime(timeStr)       //2021-04-09 21:43:26 +0000 UTC
 duration, _ := time.ParseDuration("1m30s")
 cast.ToDuration(duration)         //1m30s
 strDuration := "90s"
 cast.ToDuration(strDuration)     //1m30s
}

转换为切片

代码如下:

package main
import (
   "fmt"
   "github.com/spf13/cast"
)
func main() {
   sliceOfInt := []int{1, 3, 7}
   arrayOfInt := [3]int{8, 12}
   // ToIntSlice
   cast.ToIntSlice(sliceOfInt)  // [1 3 7]
   cast.ToIntSlice(arrayOfInt)  // [8 12 0]
   sliceOfInterface := []interface{}{1, 2.0, "gocn"}
   sliceOfString := []string{"I", "love", "gocn"}
   stringFields := " I   love  gocn   "
   any := interface{}(666)
   // ToStringSliceE
   cast.ToStringSlice(sliceOfInterface)  // [1 2 gocn]
   cast.ToStringSlice(sliceOfString)     // [I love gocn]
   cast.ToStringSlice(stringFields)      // [I love gocn]
   cast.ToStringSlice(any)               // [666]
}

转为 map[string]Type

代码如下:

package main
import (
 "github.com/spf13/cast"
)
func main() {
 m := map[interface{}]interface{}{
  "name": "gocn",
  "age":  999,
 }
 cast.ToStringMapString(m)   //map[age:999 name:gocn]
    
 data := `{"name":"gocn", "url":"https://gocn.vip"}`
 cast.ToStringMapString(data)  //map[name:gocn url:https://gocn.vip]
}

总结 

cast 库能在几乎所有常见类型之间转换,小巧但是非常的实用。

cast 提供一致且简单的方式在各种常见的类型之间进行转换,能极大的提高开发效率。

类型转换
本作品采用《CC 协议》,转载必须注明作者和本文链接
cast 用于一致且简单的方式在不同的 go 类型之间进行安全的转换。在 Go 程序中,我们通常需要将数据由一种类型转换为另一种类型。它不仅仅适用于类型断言,更强大的功能在于我们使用接口来处理动态数据的时候,cast 提供了一种简单的方法将接口优雅的转换为我们需要的数据类型。
S2-007的漏洞原理是在处理类型转换的错误时会存入错误到内存中,在后续调用流程中触发OGNL表达式注入。
经PHP官方确认,于6月9日,PHP官网发布了该漏洞的修复方案。
KCon 2021部分PPT发布
2021-11-09 07:32:15
今年是 KCon 10周年,疫情环境下线下会议举步维艰,原本计划在8月底进行的大会随后推迟到10月底。考虑到未到场听众的急切心情,我们决定提前对外发布 KCon 议题。这次披露的是QEMU中比较罕见的可控长度越界读写漏洞,可以稳定利用并进行虚拟机逃逸,本次是首次披露该模块的漏洞细节。本议题将介绍如何针对 CFI 的固有缺陷来突破其防御。
作者:Randal E. Bryant,David R. O'Hallaron来源:华章计算机(hzbook
7月20日,RedHat官方发布了Linux kernel本地权限提升漏洞的风险通告,漏洞CVE编号为CVE-2021-33909。目前Linux已发布安全版本修复该漏洞,建议受影响用户及时升级到安全版本进行防护。
2018年1月18日,国家信息安全漏洞共享平台(CNVD)收录了PHP GD Graphics Library存在拒绝服务漏洞(CNVD-2018-02505,对应CVE-2018-5711)。综合利用上述漏洞,攻击者可以构造恶意GIF文件,远程利用PHP函数形成无限循环的方式发起拒绝服务攻击。目前,漏洞利用代码已公开,且厂商已发布漏洞修复版本。
最后对响应的匹配,使用正则识别id命令之后的结果。成功扫描出CVE-2022-1388F5 BIG-IP API Unauthenticated RCE漏洞,漏洞的请求也变异无误,最后的响应中也是执行了id命令。案例二:利用Scalpel工具挖掘多个0day漏洞Scalpel工具使用较为灵活,通过对检测目标变异响应的check,可以发现检测目标中未知的安全问题。同时发现某Apache开源项目的CVE漏洞,报告被该团队接受并正在修复,尚未披露。
EasyJaba 这个题目是陇原战”疫”2021网络安全大赛的一道题,最近正好在学习java反序列化和内存马的相关知识,通过这个题目可以很好的进行实践。 反序列化
进程注入的探索
2022-07-29 08:22:06
0x01 简单描述进程注入就是给一个正在运行的程序开辟一块内存,把shellcode放入内存,然后用一个线程去执行shellcode。
VSole
网络安全专家