作用域
universe block > package block > file block > function block > inner block
universe block
預聲明的標識符。Go文件全部使用
1 2 3 4 5 6 7 8
| Types: bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 rune string uint uint8 uint16 uint32 uint64 uintptr Constants: true false iota Zero value: nil Functions: append cap close complex copy delete imag len make new panic print println real recover
|
package block
例子 fmt下面的函數println 就是package scope
1 2 3 4 5 6 7 8 9 10
| package main
import "fmt"
var x int=5
func main(){
fmt.Println("mainx:",x) }
|
外部變量是package block:
下面的代碼有效:
1 2 3 4 5 6 7 8 9 10
| package main
var x int
package main
func f() { fmt.Println(x) }
|
調用另一個包中的函數和屬性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package testdemo
import "fmt"
var Birth uint = 23 func Haha(){ fmt.Println("lalalal") }
package main
import ( "testdemo" "fmt" )
func main(){
testdemo.Haha() fmt.Println(testdemo.Birth) }
|
權限
如果要讓包中的屬性和變量被外部包調用,必須要首字母大寫。
file block
下面的代碼無效,因爲import 是file block 。不能跨文件
1 2 3 4 5 6 7 8 9 10
| package main
import "fmt"
package main
func f() { fmt.Println("Hello World") }
|
function block
函數體內部的變量是function block,注意前後順序,同時不能跨函數使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| func main() { fmt.Println("Hello World") x := 5 fmt.Println(x) }
func main() { fmt.Println("Hello World")
fmt.Println(x) x := 5 }
func main() { fmt.Println("Hello World") x := 5 fmt.Println(x) }
func test(){ fmt.Println(x) }
|
函數內部變量與外部變量重名
就近原則
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package main
import "fmt"
var x int=5
func test(){
var x int = 99; x = 100; fmt.Println("testx",x)
}
|
inner block
在花括號中聲明的變量只在花括號中有效。
1 2 3 4 5 6 7 8
| //內部變量 func main() { fmt.Println("Hello World") // x is out of scope { // x is out of scope x := 5 // x is in scope fmt.Println(x) // x is in scope } // x is out of scope again }
|
下面代碼無效:
1 2 3 4 5 6
| func main() { { x := 5 } fmt.Println(x) }
|
參考資料:
Variables