# #go
Вопрос:
Я потратил много часов, пытаясь передать данные из этой функции в другую, и на данный момент мне действительно нужна помощь.
type Rules struct {
Value string `json:"value"`
Tag string `json:"tag"`
Id string `json:"id"`
}
func getRules() {
accessKey := os.Getenv("API_KEY")
accessSecret := os.Getenv("API_SECRET_KEY")
tok, err := twitterstream.NewTokenGenerator().SetApiKeyAndSecret(accessKey, accessSecret).RequestBearerToken()
if err != nil {
panic(err)
}
api := twitterstream.NewTwitterStream(tok.AccessToken)
res, err := api.Rules.GetRules()
if err != nil {
panic(err)
}
if res.Errors != nil amp;amp; len(res.Errors) > 0 {
panic(fmt.Sprintf("Received an error from twiiter: %v", res.Errors))
}
bytes := []byte(res.Data)
// this is the line, here
var rules []Rules
json.Unmarshal(bytes, amp;rules)
for l := range rules {
fmt.Printf("Id = %v, Value = %v", rules[l].Id, rules[l].Value)
fmt.Println()
}
fmt.Println(res.Data)
}
Ошибка, которую я получаю, заключается в следующем:
cannot convert res.Data (type []twitterstream.rulesResponseValue) to type []byte
Кто-нибудь может помочь мне обработать эти данные? Я пытаюсь преобразовать данные в свою собственную структуру, которую я могу вернуть, но это было одно за другим!
Комментарии:
1. Это может помочь: tour.golang.org/basics/6
2. @yangszwei
cannot refer to unexported name twitterstream.rulesResponseValue
3. Вы можете вернуть данные как
interface{}
, или, возможно, вы можете преобразовать данные в свою собственную структуру.4. @gfylol вы не можете ссылаться на несообщенные идентификаторы из импортированных пакетов. Go просто не допускает этого. Поскольку
rulesResponseValue
начинается со строчной буквы, поэтому он не передается . В Go экспортируются только идентификаторы, начинающиеся с прописных букв, и поэтому на них можно ссылаться за пределами пакета, в котором они объявлены.5. @gfylol какой пакет
twitterstream
?
Ответ №1:
Если ваш Rules
тип имеет тот же базовый тип, rulesResponseValue
что и тип, вы можете использовать выражение преобразования для отдельных элементов Data
среза, чтобы напрямую преобразовать экземпляр типа rulesResponseValue
в экземпляр Rules
типа.
// I renamed Rules to Rule
type Rule struct {
Value string `json:"value"`
Tag string `json:"tag"`
Id string `json:"id"`
}
func getRules() ([]Rule, error) {
accessKey := os.Getenv("API_KEY")
accessSecret := os.Getenv("API_SECRET_KEY")
tok, err := twitterstream.NewTokenGenerator().SetApiKeyAndSecret(accessKey, accessSecret).RequestBearerToken()
if err != nil {
return nil, err
}
api := twitterstream.NewTwitterStream(tok.AccessToken)
res, err := api.Rules.GetRules()
if err != nil {
return nil, err
} else if res.Errors != nil amp;amp; len(res.Errors) > 0 {
return nil, fmt.Errorf("Received an error from twitter: %v", res.Errors)
}
rules := make([]Rule, len(res.Data))
for i := range res.Data {
rules[i] = Rule(res.Data[i]) // convert rulesResponseValue to Rule
}
return rules, nil
}
И затем вы можете использовать это вот так
func main() {
rules, err := getRules()
if err != nil {
panic(err)
}
for _, r := range rules {
fmt.Printf("Id = %v, Value = %vn", r.Id, r.Value)
}
}