3

As a Go "newb" I'm not sure why I'm receiving the errors undefined err and undefinded user in the console when compiling the program.

I have:

if req.Id == nil { user, err := signup(C, c, &req) } else { user, err := update(C, c, &req) } if err != nil { c.JSON(http.StatusOK, err) return } doSomethingWith(user) 

I realise I could probably declare the err and user variables before the conditional block but I would like to know why this doesn't work. Is it something to do with creating two new variables in one go?

UDPATE Getting in a bit of a mess with this.

I've now got:

user := core.User{} if req.Id == nil { user, err := signup(C, c, &req) } else { user, err := update(C, c, &req) } cleanUser(&user) 

and my errors now are user declared and not used. I'm not tackling the err part at the moment but I'm unsure why I'm getting errors about the user.

0

1 Answer 1

11

It's because the scope of the err variable you're creating: it is only in scope (and therefore valid/referable) till the end of innermost block in which you declared it.

Spec: Declarations and scope

The scope of a constant or variable identifier declared inside a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl for short variable declarations) and ends at the end of the innermost containing block.

When you declare it before the if statement, then it will be in scope till the end of the container block which also includes the 2nd if where you test the err variable, so that is ok.

UDPATE:

Update to your update: you used a Short variable declaration which creates new variables because you used it in a new block. You haven't used these new variables (only the "other" user declared outside the inner block) hence the compile time error "user declared and not used".

Solution is simple: simply declare both variables before the if and don't use short variable declaration but simply assignment:

user := core.User{} var err error if req.Id == nil { user, err = signup(C, c, &req) } else { user, err = update(C, c, &req) } if err == nil { cleanUser(&user) } 

Or using one line to declare both user and err:

user, err := core.User{}, error(nil) 
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the answer - getting in a bit of a mess though so updated my question. Any code sample would be much appreciated

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.