【问题标题】:Why is *a{...} invalid indirect?为什么 *a{...} 间接无效?
【发布时间】:2014-01-02 20:01:31
【问题描述】:

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
}

【问题讨论】:

  • 星号*也许不需要?
  • 如果我删除它,那么来自TwitterApiAuthorizeToken 开始抱怨它需要一个指针:)
  • 也许是TwitterApi(&amp;requestToken,...)
  • 好的,现在明白了,谢谢:)

标签: go


【解决方案1】:

这一行:

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

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

相反,您希望创建实例并获取其地址 (&amp;),从而生成指向 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)

【讨论】:

  • 这就是为什么你是最聪明的人。
【解决方案2】:

您需要创建一个指向您正在创建的值的指针,这是通过 &amp; 完成的,* 则相反,它取消引用一个指针。所以:

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)

【讨论】:

    【解决方案3】:

    我可以补充一下上面的答案,如果我们想在一行中明确查看结构值,我们可以这样做:

    *&yourStruct
    

    从哪里获取结构的实例,查看它的内存地址,然后访问它的值。

    【讨论】:

    • 不知道你能做到这一点 :) 虽然我认为你不会在代码中看到这一点,因为上面的代码与 yourStruct 示例 play.golang.org/p/DeIQ23Z4KqJ 相同跨度>
    • 你的代码只是意味着,变量 yourStruct 的地址上引用的值,所以写 yourStruct 也是一样的
    猜你喜欢
    • 2010-12-16
    • 2017-12-13
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2022-06-11
    • 2014-06-10
    相关资源
    最近更新 更多