无法将 res.Data类型 []twitterstream.rulesResponseValue转换为类型 []byte

问题描述

我一直在浪费很多时间试图将数据从这个函数传递到另一个函数,此时我真的需要帮助。

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 && 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,&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

有人可以帮我处理这些数据吗?我正在尝试将数据转换为我可以返回的我自己的结构,但这是一件又一件的事情!

解决方法

只要您的 Rules 类型与 rulesResponseValue 类型具有相同的基础类型,您就可以在 conversion expression 的各个元素上使用 Data {3}} 切片将 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 && 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 = %v\n",r.Id,r.Value)
    } 
}