An aside: The last example in the previous section demonstrates a detail of how the `:=` short declaration form works. The declaration that calls `os.Open` reads, ```go f, err := os.Open(name) ``` This statement declares two variables, `f` and `err`. A few lines later, the call to `f.Stat` reads, ```go d, err := f.Stat() ``` which looks as if it declares `d` and `err`. Notice, though, that `err` appears in both statements. This duplication is legal: `err` is declared by the first statement, but only re-assigned in the second. This means that the call to `f.Stat` uses the existing `err` variable declared above, and just gives it a new value. In a `:=` declaration a variable `v` may appear even if it has already been declared, provided: * this declaration is in the same scope as the existing declaration of `v`. if `v` is already declared in an outer scope, the declaration will create a new variable (It's worth noting here that in Go the scope of function parameters and return values is the same as the function body, even though they appear lexically outside the braces that enclose the body. ), * the corresponding value in the initialization is assignable to `v`, * there is at least one other variable that is created by the declaration. This unusual property is pure pragmatism, making it easy to use a single `err` value, for example, in a long `if-else` chain. You'll see it used often.