Не похоже, что клиент просто возвращает вам кусочек строк. Используемый вами синтаксис диапазона (for k, v := range search.Statuses
) возвращает два значения для каждой итерации: индекс в срезе (в данном случае k
) и объект из среза (в данном случае v
). Я не знаю тип search.Statuses
- но я знаю, что у строк нет поля или метода .Text
, который вы сейчас печатаете v
.
На ваш вопрос:
Есть ли какая-либо конкретная причина возвращать только одну структуру с полем Data
, а не напрямую возвращать выходные данные клиента twitter?
Ваша подпись функции может выглядеть следующим образом:
func (SearchTwitter) execute(input SearchTwitterInput) ([]<client response struct>, error)
И тогда вы можете оперировать текстом в тех объектах, где бы эта функция ни вызывалась.
Если вы намерены поместить данные в свою собственную структуру, вы можете вернуть их часть ([]*SearchTwitterOutput
), и в этом случае вы можете создать один SearchTwitterOutput
в цикле for, в котором вы находитесь. в настоящее время распечатывает твиты и добавляет их в список вывода. Это может выглядеть так:
var output []*SearchTwitterOutput
for k, v := range search.Statuses {
fmt.Printf("Tweet %d - %s\n", k, v.Text)
output = append(output, &SearchTwitterOutput{
Data: v.Text,
})
}
return output, nil
Но если ваша цель на самом деле состоит в том, чтобы вернуть все результаты, объединенные вместе и помещенные в одну структуру, я бы предложил создать фрагмент строк (содержащий нужный текст), а затем объединить их с разделителем по вашему выбору. , Затем вы можете поместить одну выходную строку в ваш возвращаемый объект, который может выглядеть примерно так:
var outputStrings []string
for k, v := range search.Statuses {
fmt.Printf("Tweet %d - %s\n", k, v.Text)
outputStrings = append(outputStrings, v.Text)
}
output = strings.Join(outputStrings, ",")
return &SearchTwitterOutput{
Data: output,
}, nil
Хотя я хотел бы предостеречь, может быть сложно найти разделитель, который никогда не появится в твиттере.