为了账号安全,请及时绑定邮箱和手机立即绑定

将字符串转换为任何其他原始类型的惯用方法

将字符串转换为任何其他原始类型的惯用方法

Go
慕妹3146593 2023-06-01 10:00:39
我正在尝试创建一个可以将给定字符串转换为给定反射类型的函数。我正在使用cast包:package mainimport (    "fmt"    "reflect"    "strings"    "github.com/spf13/cast")type functions struct{}func (f functions) Float64(v string) float64 {    return cast.ToFloat64(v)}func toTarget(v string, target reflect.Kind) interface{} {    n := strings.Title(fmt.Sprintf("%s", target))    method := reflect.ValueOf(functions{}).MethodByName(n)    // Call.    return method.Call([]reflect.Value{reflect.ValueOf(v)})[0].Interface()}func main() {    originalValue := "10.0"    floatingValue := toTarget(originalValue, reflect.Float64)    fmt.Println(floatingValue)}在上面的示例中,我保持简单(它只适用于 string -> float64 转换),但在我的代码中,它也适用于所有其他原语。我更喜欢使用这个解决方案而不是巨大而丑陋的 switch 语句,但作为一个新的 go 开发人员,我不确定是否有更好的方法。感谢您的帮助。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

您要避免的“大开关”语句已经写在标准库中。使用该fmt包可以轻松地从字符串中解析原始值,特别是fmt.Sscan()fmt.Sscanf()函数。

fmt.Sscan()需要一个字符串值来解析一些东西,以及一个变量的地址来将解析的值放入。指向变量的类型还决定了从字符串中解析出什么以及如何解析。fmt.Sscan()将返回成功解析的值的数量,以及一个可选的错误(如果出现问题)。

一个简单的例子:

var i int

if _, err := fmt.Sscan("12", &i); err != nil {

    fmt.Println("Error:", err)

}

fmt.Println(i)


var f float32

if _, err := fmt.Sscan("12.2", &f); err != nil {

    fmt.Println("Error:", err)

}

fmt.Println(f)

输出(在Go Playground上尝试):


12

12.2

另请注意,您可以使用 一步解析多个值fmt.Sscan(),例如:


var i int

var f float32


fmt.Println(fmt.Sscan("12 12.2", &i, &f))

fmt.Println(i, f)

这将打印(在Go Playground上尝试):


2 <nil>

12 12.2

第一行包含 : 的返回值fmt.Sscan(),告诉它解析了 2 个值,并且没有返回错误 ( nilerror)。第二行包含i和的解析值f。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信