Как получить отражение. Тип интерфейса? - PullRequest
16 голосов
/ 20 августа 2011

Чтобы определить, реализует ли данный тип интерфейс с помощью пакетаlect, вам нужно передать отражающий.Тип для отражения.Тип.Implements (). Как вы получаете один из этих типов?

Например, попытка получить тип неинициализированного типа os.Error (interface) работает не работает (паникует, когда вы вызываете Kind () для него)

var err os.Error
fmt.Printf("%#v\n", reflect.TypeOf(err).Kind())

Ответы [ 3 ]

28 голосов
/ 23 августа 2011

Сделайте так:

var err *os.Error
t := reflect.TypeOf(err).Elem()

Или в одну строку:

t := reflect.TypeOf((*os.Error)(nil)).Elem()
7 голосов
/ 09 января 2016

Даже ответ Шоу правильный, но краткий. Еще некоторые подробности из документации метода отражать. Тип:

// As interface types are only used for static typing, a
// common idiom to find the reflection Type for an interface
// type Foo is to use a *Foo value.

writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()

fileType := reflect.TypeOf((*os.File)(nil))
fmt.Println(fileType.Implements(writerType))
2 голосов
/ 18 июня 2015

Для googlers я просто столкнулся с ужасной ошибкой scannable dest type interface {} with >1 columns (XX) in result.

Ответ Эвана Шоу у меня не сработал.Вот как я это решил.Я также использую библиотеку lann/squirrel, но вы легко можете ее убрать.

Решение на самом деле не так уж сложно, просто зная волшебную комбинацию вызовов отражения, которые нужно сделать.Функция me.GetSqlx() просто возвращает экземпляр в *sqlx.DB

    func (me *CommonRepo) Get(query sq.SelectBuilder, dest interface{}) error {
      sqlst, args, err := query.ToSql()
      if err != nil {
        return err
      }
      // Do some reflection magic so that Sqlx doesn't hork on interface{}
      v := reflect.ValueOf(dest)
      return me.GetSqlx().Get(v.Interface(), sqlst, args...)
    }
    func (me *CommonRepo) Select(query sq.SelectBuilder, dest interface{}) error {
      sqlst, args, err := query.ToSql()
      if err != nil {
        return err
      }
      // Do some reflection magic so that Sqlx doesn't hork on interface{}
      v := reflect.ValueOf(dest)
      return me.GetSqlx().Select(v.Interface(), sqlst, args...)
    }

. Затем, чтобы вызвать его, вы можете сделать:вся общая логика в одном месте (CommonRepo в этом примере).

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