go语言渐入佳境[4]-scope作用域
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
// f1.go
package main
var x int
// f2.go
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
//testdemo/destdemo.go
package testdemo
import "fmt"
var Birth uint = 23
func Haha(){
fmt.Println("lalalal")
}
//-------------------------------------
package main // main/scope.go
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
// f1.go
package main
import "fmt"
// f2.go 无效
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
}
//下面的代码无效2:
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)
//fmt.Println("testy",y)
}
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
本文链接:https://dreamerjonson.com/2018/11/17/golang-4-scope/
版权声明:本博客所有文章除特别声明外,均采用CC BY 4.0 CN协议许可协议。转载请注明出处!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。