如何使用带界面的 Sscan

我正在使用将fmt.Sscan字符串转换为任何类型,这就是我正在做的事情:


package main


import (

    "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 语句的解决方案?


谢谢。


慕雪6442864
浏览 98回答 1
1回答

慕斯709654

以下是将字符串转换为包支持的任何类型的值的方法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)在操场上运行
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go