2015-12-15 4 views
1

У меня есть интерфейс:получить golang имя интерфейса динамически

type Printer interface { 
    Print(s string) 
} 

и FUNC:

func fxyz(name string) { 
    .... 
} 

Я хочу назвать fxyz с "Printer", но я не хочу жесткий код Струна.

Как я могу получить имя интерфейса с помощью отражения или другого подхода?

+5

Не могли бы вы уточнить, что именно вы хотите? – icza

+0

Если я хорошо понимаю, OP хочет, чтобы реализация Print вызывала fxyz, передавая имя интерфейса как параметр имени ... ну, даже тогда это не кажется намного яснее ... Использование отражения для этого было бы неприемлемым компромиссом для простого использования строковой константы «Принтер», поскольку Print всегда будет реализацией интерфейса принтера в любом случае ... – SirDarius

+0

Я думаю, что icza спрашивала больше о «почему» - то есть люди часто спрашивают, как решить конкретную проблему, чем это правильный подход. Динамически вызывающие интерфейсы в Go, как это, скорее всего, будут неправильным подходом. – elithrar

ответ

1

Если вы хотите получить имя интерфейса, вы можете сделать это с помощью reflect:

name := reflect.TypeOf((*Printer)(nil)).Elem().Name() 
fxyz(name) 

площадка: http://play.golang.org/p/Lv6-qqqQsH.

Примечание: вы не можете просто взять reflect.TypeOf(Printer(nil)).Name(), потому что TypeOf вернет nil.

Смежные вопросы