问题描述
我一直在浪费很多时间试图将数据从这个函数传递到另一个函数,此时我真的需要帮助。
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)
}
}