Why is *a{...} invalid indirect?

Go

Go Problem Overview


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

Why is the following line invalid?

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
}

Go Solutions


Solution 1 - Go

This line:

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

translated literally says "create an instance of oauth.RequestToken, then attempt to dereference it as a pointer." i.e. it is attempting to perform an indirect (pointer) access via a literal struct value.

Instead, you want to create the instance and take its address (&), yielding a pointer-to-RequestToken, *oauth.RequestToken:

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

Alternatively, you could create the token as a local value, then pass it by address to the TwitterApi function:

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

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

Solution 2 - Go

You'll need to create a pointer to the value you're creating, which is done with & , * does the opposite, it dereferences a pointer. So:

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

Now requestToken is a pointer to a oauth.RequestToken value.

Or you can initialize requestToken as a value:

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

Now requestToken is a oauth.RequestToken value.

Then you can pass a pointer to that value to TwitterApi

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

Solution 3 - Go

I may add to the top answer, if we want to explicitly look at a struct value in one line we could do this :

*&yourStruct

Where you get the instance of your struct, look up at its memory address, and access its value.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGert CuykensView Question on Stackoverflow
Solution 1 - GolnmxView Answer on Stackoverflow
Solution 2 - GonosView Answer on Stackoverflow
Solution 3 - GoPensée AbsurdeView Answer on Stackoverflow