20

I've just started learning Go today and have got stuck on variable scopes.

I've ultimately confused about how to get around the fact that I can't create a variable inside an if statement and the use it afterward.

This is my code. The problem is that new1 can't be created before the if statement because its size is dependent upon the result of the if statement, and by creating it inside the if statement I can't use it after the if statement ends.

if len(array1)>len(array2) {
    new1 := make([]string,0,len(array1))
    mc := Array2Map_string(array1)
    for _,tok :=range array2 {
        _, ok := mc[tok]
        if ok {
            new1[len(new1)]=tok
            }
        }
    } else {
    new1 := make([]string,0,len(array2))
    mc := Array2Map_string(array2)
    for _,tok :=range array1 {
        _, ok := mc[tok]
        if ok {
            new1[len(new1)]=tok
            }
        }
    }
new2 := make([]string,0,len(new1))
copy(new2, new1)

The only thing I can think of is to do something like

var pointlessvariable uint
if len(array1)>len(array2) {
pointlessvariable=len(array1)
} else {
pointlessvariable=len(array2)
}
var new1 = make([]string,0,pointlessvariable)
if len(array1)>len(array2) {
...

To be quite honest if that is truly the solution then I don't think I want to use Golang after all.

So what is the best way of solving this?

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Alasdair
  • 13,348
  • 18
  • 82
  • 138

2 Answers2

19

You can declare new1 before the if block and use make inside:

var new1 []string

if len(array1)>len(array2) {
    new1 = make([]string, 0, len(array1))
    // instructions ...
} else {
    new1 = make([]string, 0, len(array2))
    // other instructions ...
}

new2 := make([]string, 0, len(new1))
copy(new2, new1)
julienc
  • 19,087
  • 17
  • 82
  • 82
  • OK, thank you. So is that array actually created on the first line, or does that only make it ready to be created and have the more global scope? – Alasdair Jun 29 '14 at 10:36
  • It's not an array but a slice. It is created on the first line, but its length is 0 until you use `make` to define its length (and capacity). But you can still use a zero-sized slice with `append` for instance: `make` is not the only solution. – julienc Jun 29 '14 at 10:38
5

Slightly related to the question of variable scope, new gophers (go programmers) might find it interesting that you can also arbitrarily force variable scope with a pair of curly brackets { } anywhere in the code. You don't need a keyword for this.

Example:

// Outside of scope
var color = "blue"

{
    // Inside a new scope
    var color = "red"
    fmt.Println(color) // Prints red
}

// Outside of scope again
fmt.Println(color) // Prints blue again
kintsukuroi
  • 1,332
  • 16
  • 15