Syntactic block: Enclosed in braces
Lexical block: Not explicitly surrounded by braces
Universe block: A lexical block for the entire source code. Include built-in types, function.. Can be referred throughout the entire program
Package level declarations: out side any function can be referred to from any file in the same package
File level declarations: in imported path, can be referred in the same file, but not from another file in the same package without another import.
(Ex. "fmt" is imported in packageFile1.go, packageFile2.go can not use "fmt", need import by itself)
Declared function can be referenced in the same package, even in different file.
Inner shadow outer block name: Compiler find the innermost enclosing lexical block an up to the universe block. When a name is declared in outer and inner block, inner declaration will be found first.
This example shows inner x hide outer x
This example shows we can declare x and y in "if-else" scope, the the variable is not available out of "if-else" scope
This example shows we can limit file read variables in "if-else" scope
Avoid declare := in a separate var declaration In order to prevent potential problem.