Напечатайте тип без использования reflrect и создайте новый объект - PullRequest
0 голосов
/ 26 октября 2018

В приведенном ниже коде, чтобы показать ожидаемый тип, я должен создать новый объект и вызвать на нем reflect.TypeOf.

package main

import (
    "fmt"
    "reflect"
)

type X struct {
    name string
}

func check(something interface{}) {
    if _, ok := something.(*X); !ok {
        fmt.Printf("Expecting type %v, got %v\n", 
            reflect.TypeOf(X{}), reflect.TypeOf(something))
    }
}

func main() 
    check(struct{}{})
}

Возможно, создание объекта - это не накладные расходы, но явсе еще любопытно узнать лучший способ.Есть ли что-то вроде X.getName() или X.getSimpleName() в Java?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Использование отражений - почти всегда плохой выбор.Вы можете рассмотреть возможность использования одного из следующих способов

Использовать переключатель

Если вы хотите управлять потоком в зависимости от типа, вы можете использовать конструкцию switch

func do(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("Twice %v is %v\n", v, v*2)
    case string:
        fmt.Printf("%q is %v bytes long\n", v, len(v))
    default:
        fmt.Printf("I don't know about type %T!\n", v)
    }
}

Используйте fmt пакет

Если вы хотите отобразить только его тип, вы всегда можете использовать fmt пакет

i := 1000
fmt.Printf("The type is %T", i)
0 голосов
/ 26 октября 2018

Чтобы получить дескриптор типа reflect.Type, вы можете использовать

reflect.TypeOf((*X)(nil)).Elem()

, чтобы избежать создания значения типа X.Смотрите эти вопросы для более подробной информации:

Как получить строковое представление типа?

Golang TypeOf без экземпляра и передачи результата в func

А чтобы напечатать тип некоторого значения, вы можете использовать fmt.Printf("%T, something).

А для того, что вы хотите сделать, вы можете полностью отразить отражение, просто сделайте:

fmt.Printf("Expecting type %T, got %T\n", (*X)(nil), something)

Вывод будет (попробуйте на Go Playground ):

Expecting type *main.X, got struct {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...