go的类型转换cast

在使用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

posted @ 2022-09-26 07:30  技术颜良  阅读(200)  评论(0编辑  收藏  举报