【发布时间】:2019-06-02 03:49:47
【问题描述】:
我正在尝试创建一个可以将给定字符串转换为给定反射类型的函数。
我正在使用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)
}
在上面的示例中,我保持简单(它仅适用于字符串 -> float64 转换),但在我的代码中,它也适用于所有其他原语。
我更喜欢使用这个解决方案而不是巨大而丑陋的 switch 语句,但作为一个新的 go 开发人员,我不确定是否有更好的方法。
感谢您的帮助。
【问题讨论】:
-
Go 中根本没有类型转换,无论是惯用的还是其他的。仅类型转换。
-
为什么不直接使用
n, err := fmt.Sscan("someString", &variable)?这将处理您需要的大多数类型。剩下的,你无论如何都需要自定义解析...... -
嘿@icza,你能提供一个使用
fmt.Sscan的工作示例吗?我正在尝试,但它一直返回错误expected integer。 -
为什么投反对票?这个问题是有效的,并提供了我想要完成的事情。
-
@ubaxibuna 使用
fmt.Sscan(),您必须传递变量的地址,而不是reflect.Kind,例如var i int; fmt.Sscan("12", &i)