我正在使用将fmt.Sscan字符串转换为任何类型,这就是我正在做的事情:package mainimport ( "fmt" "reflect")func test() interface{} { return 0}func main() { a := test() // this could be any type v := "10" // this could be anything fmt.Println(reflect.TypeOf(a), reflect.TypeOf(&a)) _, err := fmt.Sscan(v, &a) fmt.Println(err)}此代码失败,因为Sscan不接受接口作为第二个值:can't scan type: *interface {}。演示我觉得最奇怪的是第一个 print 打印:int *interface {}, is it a int or an interface?我如何断言a正确的类型(它可以是任何原始类型)?有没有不包含巨型 switch 语句的解决方案?谢谢。
1 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
以下是将字符串转换为包支持的任何类型的值的方法fmt:
// convert converts s to the type of argument t and returns a value of that type.
func convert(s string, t interface{}) (interface{}, error) {
// Create pointer to value of the target type
v := reflect.New(reflect.TypeOf(t))
// Scan to the value by passing the pointer SScan
_, err := fmt.Sscan(s, v.Interface())
// Dereference the pointer and return the value.
return v.Elem().Interface(), err
}
像这样称呼它:
a := test()
a, err := convert("10", a)
fmt.Println(a, err)
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消