为什么* a {...}无效间接?

时间:2014-01-02 20:01:32

标签: go

invalid indirect of oauth.RequestToken literal (type oauth.RequestToken)

为什么以下行无效?

func (s *Service) Callback(r *http.Request, req *RequestOauth, resp *Response) error {
    c := endpoints.NewContext(r)
    consumer.HttpClient=urlfetch.Client(c)
    ====>requestToken := *oauth.RequestToken{Token:req.Oauth_token, Secret:""}<======
    b, err := TwitterApi(requestToken, req.Oauth_verifier)
    resp.Message=b.Name
    return err
}

func TwitterApi(requestToken *oauth.RequestToken, verificationCode string) (u *UserT, err error) {
    accessToken, err := consumer.AuthorizeToken(requestToken, verificationCode)
    if err != nil {log.Fatal(err)}
    response, err := consumer.Get("https://api.twitter.com/1.1/account/verify_credentials.json", nil, accessToken)
    if err != nil {log.Fatal(err)}
    defer response.Body.Close()
    b, err := ioutil.ReadAll(response.Body)
    err = json.Unmarshal(b, &u)
    return
}

3 个答案:

答案 0 :(得分:65)

这一行:

requestToken := *oauth.RequestToken{Token:req.Oauth_token, Secret:""}

翻译字面意思是“创建oauth.RequestToken的实例,然后尝试将其解除引用作为指针。”即它试图通过文字结构值执行间接(指针)访问。

相反,您希望创建实例并获取其地址(&),产生指向RequestToken的指针*oauth.RequestToken

requestToken := &oauth.RequestToken{Token:req.Oauth_token, Secret:""}

或者,您可以将令牌创建为本地值,然后通过地址将其传递给TwitterApi函数:

requestToken := oauth.RequestToken{Token:req.Oauth_token, Secret:""}

b, err := TwitterApi(&requestToken, req.Oauth_verifier)

答案 1 :(得分:9)

您需要创建一个指向您正在创建的值的指针,使用&完成,*执行相反的操作,它会取消引用指针。所以:

requestToken := &oauth.RequestToken{Token:req.Oauth_token, Secret:""}

现在requestToken是一个指向oauth.RequestToken值的指针。

或者您可以将requestToken初始化为值:

requestToken := oauth.RequestToken{Token:req.Oauth_token, Secret:""}

现在requestToken是一个oauth.RequestToken值。

然后你可以将指向该值的指针传递给TwitterApi

  b, err := TwitterApi(&requestToken, req.Oauth_verifier)

答案 2 :(得分:1)

如果要在一行中显式查看结构值,我可以添加到最上面的答案,我们可以这样做:

*&yourStruct

在获取结构实例的地方,查找其内存地址并访问其值。