Не удается преобразовать res.Данные (введите []twitterstream.rulesResponseValue) для ввода []байт

# #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)
    } 
}