Go 第三方库之圭表类型转换问题

2026-07-21 19:11:04/焦点/6638 阅读

强圭表类型言语有它的第方优势 ,但也有利便当的圭表中心,最类型的类型就是圭表类型转换 。Golang 作为一门强圭表类型言语,转换并且不支撑隐式圭表类型转换 ,问题是第方以这个问题更凹陷 。当然 Go 供给了良多编制举办圭表类型转换,圭表包含相干的类型标准库 ,比如 strconv 包 。转换

可是问题,strconv 包独霸没那么利便 ,第方比如 "8" 转为 int 圭表类型:

s := "8"i,圭表 err := strconv.Atoi(s)

你必须对 err 举办措置  ,因为前去两个值  ,类型没法直接将下场传递给领受 int 参数的转换函数,独霸利便当 。问题

往日给大年夜师引见一个第三方库,专门措置圭表类型转换的问题。

01 为甚么需求圭表类型转换

有一些场景会需求独霸圭表类型转换 :

从 yaml、toml、json 等设置设备放置文件中读取数据;
从群集领受请求数据;
其他经由过程 inte***ce{ } 措置数据的气候;
。 。  。
转换为切确的圭表类型 ,能充分独霸强圭表类型的益处,让法度圭表类型更结实、更安然 。

02 spf13/cast

第三方包 github.com/spf13/cast 专门措置圭表类型转换的问题 ,这个包产生发火于 hugo。事前次要用于措置 yaml 等设置设备放置文件数据的转换  。该包不会 panic。

该包如今有 1.6k+ 的 Star ,有超出 4000 多个开源项目独霸了该包。

这个包独霸很复杂,次要有两套函数:

1)To_ 编制函数

这些函数不竭前去所需的圭表类型 。假定没法切确转换为对应的圭表类型 ,则前去方针圭表类型的零值。

支撑的圭表类型包含全数的根本数据圭表类型 ,还支撑 time.Time、time.Duration 、slice、map 等经常独霸圭表类型。

比如:

cast.ToString("mayonegg")         // "mayonegg"cast.ToString(8)                  // "8"cast.ToString(8.31)               // "8.31"cast.ToString([]byte("one time")) // "one time"cast.ToString(nil)                // ""cast.ToTime("2021-08-10 22:00:00") // 2021-08-10 22:00:00 +0000 UTC

寄看,转换为 time.Time 时,需求寄看时区问题。ToTime 默许独霸 UTC,假定想用其他时区,得近似这么做:

secondsEastOfUTC := int((8 * time.Hour).Seconds())beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)fmt.Println(cast.ToTimeInDefaultLocation("2021-08-10 22:00:00", beijing))

当然,你也可以多么:

fmt.Println(cast.ToTimeInDefaultLocation("2021-08-10 22:00:00", time.Local))

不过 ,Local 展示外埠时区,要了了这个外埠是不是是你想要的。

2)To_E 编制函数

E 展示 error ,也就是说,这一系列函数会前去 error。在没法举办圭表类型转换时,会将偏向启事前去  。To_ 编制内部调用的是 To_E 形似 ,只是它忽视了偏向。

这类编制就不举例了。一样往常地 ,除非你需求分辨零值是因为犯错招致的仍是本身就是零值,不然理应独霸 To_ 系列函数 ,幻想下场更省事。

03 总结

大年夜大年夜体率 ,良多公司都有本身近似的库。假定没有 ,可以思虑独霸该库 ,多么的轮子 ,没太多需求造。不过这个库有一点我不太快活喜悦爱好 ,就是没法指定默许值。

比如,我想在转换损掉落踪落败时,前去我的默许值 ,而不是默许零值,这个包做不到。罕有的场景就是,措置用户可选输进,假定用户没输进  ,给一个默许值 。

设置设备放置文件也有多么的场景 ,比如某个设置设备放置项假定没有设置设备放置,我希看硬编码一个默许值。因为 cast 不支撑 ,依托 cast 的 github.com/spf13/viper 库也不支撑默许值 ,招致我会写出多么的繁琐代码:

viper.SetDefault("listen.port", "2021")port := viper.GetString("listen.port")

我更希看的是多么的代码 :

port := viper.GetString("listen.port", "2021") // listen.port 没设置时
,前去 2021

到此这篇关于Go 第三方库之圭表类型转换问题标文章就引见到这了,更多相干Go 第三方库圭表类型转换内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!

#免责声明#

本站提供的一切资源、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,版权争议与本站无关。