Как использовать Sscan с интерфейсом - PullRequest
0 голосов
/ 21 января 2019

Я использую 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?

Спасибо.

1 Ответ

0 голосов
/ 21 января 2019

Вот как преобразовать строку в значение любого типа, поддерживаемого пакетом 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)

Выполнитьэто на детской площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...