2016-11-28 3 views
0

Я пытаюсь вручную создать экземпляр типа ReactionAddedEvent, указанный here, in nlopes' Go Slack library. Тем не менее, тип реакции подтипа не поддерживается, что приводит меня к ошибке ./bot_test.go:111: cannot refer to unexported name slack.reactionItem при попытке создать экземпляр объекта.Создание экземпляра структуры с невыдвинутыми подструктурами в Go

Вот мой код:

m := &slack.ReactionAddedEvent{ Item: &slack.reactionItem{ File: &slack.File{ Preview: "Test", URLPrivate: "http://google.com", }, }, Reaction: "white_check_mark", }

Когда я удалить идентификатор &slack.reactionItem из строки 2 в этом фрагменте кода, я получаю вместо ошибки: ./bot_test.go:112: missing type in composite literal, очевидно.

Есть ли способ создать экземпляр объекта этого типа с параметрами, которые мне нужны?

ответ

3

Во-первых, если slack здесь относится к nlopes библиотеке, Item поле в slack.ReactionAddedEvent структура не является указателем, так что вы не можете сохранить адрес slack.reactionItem структуры в этой области в любом случае. Во-вторых, поле Fileslack.reactionItem является строкой, а не структурой.

В-третьих, даже если выше не было/не было, если типы не экспортируются, но сами поля, вы не можете собрать структуру в одном литерале. Вместо этого, вам придется вручную установить эти поля после создания переменной структуры:

m := &slack.ReactionAddedEvent{Reaction: "white_check_mark"} 
m.Item.File.Preview = "Test" 
m.Item.File.URLPrivate = "http://google.com" 

Но опять же, если вы используете nlopes библиотеку, которая не будет работать, потому что File поле не на самом деле структура: https://github.com/nlopes/slack/blob/master/websocket_reactions.go

И четвёртое, если тип не экспортируется, это, вероятно, хороший знак, что вы не должны быть манипулирования объектами этого типа. В этом случае в библиотеке nlopes эти структуры предназначены только для использования для развязывания и обработки событий из сообщений JSON.

+0

Зачем вам этот пакет экспортировать ReactionAddedEvent на первом месте? – mpm

+1

Это типизация неэкспортированной структуры, но похоже, что это экспортированный тип (с экспортированными полями), поэтому клиенты библиотеки могут реализовать обработчики для типов событий. Из их полей примеров: https://github.com/nlopes/slack/blob/master/examples/websocket/websocket.go – Kaedys

+3

Идея, однако, состоит в том, что события создаются _created_ библиотекой slack из событий, которые полученные в виде сообщений JSON, а затем преобразовываются в эти экспортированные типы событий, для которых клиент может настроить обработчик. Клиент не должен сам создавать события. – Kaedys

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