我正在使用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 {}demo

我最奇怪的是,第一张照片打印出来了:int *interface {},是int还是接口?

如何将a断言为正确的类型(可以是任何原始类型)?是否有不包含巨大的switch语句的解决方案?

谢谢。

最佳答案

以下是将字符串转换为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)

Run it on the Playground

关于string - 如何在界面上使用Sscan,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54296286/

10-11 20:50