Получить базовое отражение. Значение из интерфейса {} - PullRequest
3 голосов
/ 06 июня 2019

Я пытаюсь написать функцию, которая возвращает базовый отражатель. Значение в пустом интерфейсе {}, предоставляя базовый тип с использованием отражателя. Тип:

// code in: https://play.golang.org/p/p6NLm18LjzM
package main

import (
    "fmt"
    "reflect"
)

type MyInt struct{
    x int
}

func getUnderlyingAsValue( data interface{}, underlyingType reflect.Type) reflect.Value{

    underlyingData := data.(underlyingType) // <-- Doesn't compile "underlyingType is not a type"
    return reflect.ValueOf(underlyingData)

}

func main() {

    var i int
    i = 5
    myInt := &MyInt{x:i}

    underVal := getUnderlyingAsValue(myInt, reflect.TypeOf(i))

    if underVal.Type() != reflect.TypeOf(myInt){
        fmt.Printf("Doesn't Work! :-(")
    } else {
        fmt.Printf("SUCCESS!")
    }
}

Как написано в коде, утверждение типа не работает, потому что "refle.Type" не является типом.

У кого-нибудь есть идеи, как это решить? Желательно, не заходя в uintptr в базовой структуре интерфейса (если есть такой способ).

Спасибо!

1 Ответ

0 голосов
/ 06 июня 2019

Go - статически типизированный язык, вы не можете набирать assert для «динамических типов».

Но ты не обязан. «Обтекание» любого конкретного значения, доступного в значении interface{}, не требует никакой магии, просто передайте это как есть reflect.ValueOf():

func getUnderlyingAsValue(data interface{}, underlyingType reflect.Type) reflect.Value {
    return reflect.ValueOf(data)
}

Или просто:

func getUnderlyingAsValue(data interface{}) reflect.Value {
    return reflect.ValueOf(data)
}

(Эта функция даже не оправдана, она так проста ...)

Попробуйте на игровой площадке Go .

Не существует точечной установки типа конкретного типа из interface{}, когда следующая и единственная выполняемая вами операция - это передача функции, ожидающей interface{}. Он снова будет завернут в interface{}.

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