猿问

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

我正在尝试创建一个可以将给定字符串转换为给定反射类型的函数。

我正在使用cast包:

package main


import (

    "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 开发人员,我不确定是否有更好的方法。


感谢您的帮助。


慕妹3146593
浏览 109回答 1
1回答

慕标琳琳

您要避免的“大开关”语句已经写在标准库中。使用该fmt包可以轻松地从字符串中解析原始值,特别是fmt.Sscan()和fmt.Sscanf()函数。fmt.Sscan()需要一个字符串值来解析一些东西,以及一个变量的地址来将解析的值放入。指向变量的类型还决定了从字符串中解析出什么以及如何解析。fmt.Sscan()将返回成功解析的值的数量,以及一个可选的错误(如果出现问题)。一个简单的例子:var i intif _, err := fmt.Sscan("12", &i); err != nil {    fmt.Println("Error:", err)}fmt.Println(i)var f float32if _, err := fmt.Sscan("12.2", &f); err != nil {    fmt.Println("Error:", err)}fmt.Println(f)输出(在Go Playground上尝试):1212.2另请注意,您可以使用 一步解析多个值fmt.Sscan(),例如:var i intvar f float32fmt.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。
随时随地看视频慕课网APP

相关分类

Go
我要回答