1、变量作用域
1.1、全局变量
全局变量是定义在函数外部的变量,在程序整个运行周期内都有效
//定义全局变量num
var num int64 = 10
func testGlobalVar() {
fmt.Printf("num=%d\n", num) //函数中可以访问全局变量num
}
func main() {
testGlobalVar() //num=10
}
1.2、局部变量
函数内定义的局部变量无法在该函数外使用
func testLocalVar() {
//定义一个函数局部变量x,仅在该函数内生效
var x int64 = 100
fmt.Printf("x=%d\n", x)
}
func main() {
testLocalVar()
fmt.Println(x) // 在testLocalVar函数外此时无法使用变量x
}
如果局部变量和全局变量重名,优先访问局部变量
//定义全局变量num
var num int64 = 10 //全局变量num
func testNum() {
num := 100 //局部变量num
fmt.Printf("num=%d\n", num) // 函数中优先使用局部变量
}
func main() {
testNum() // num=100
}
在控制流程语句块内定义的变量只在语句块中生效,通常在if条件判断、for循环、switch语句上使用这种定义变量的方式
func testLocalVar2(x, y int) {
fmt.Println(x, y) //函数的参数也是只在本函数中生效
if x > 0 {
z := 100 //变量z只在if语句块生效
fmt.Println(z)
}
//fmt.Println(z)//此处无法使用变量z
}
for循环语句中的变量也只在for语句块中生效
func testLocalVar3() {
for i := 0; i < 10; i++ {
fmt.Println(i) //变量i只在当前for语句块中生效
}
//fmt.Println(i) //此处无法使用变量i
}
2、函数类型与变量
go语言中函数也是一种类型,可以和其它类型一样保存在变量中
2.1、定义函数类型
可以使用type关键字来定义函数类型
type calculation func(int, int) int
定义了一个calculation类型,是一种函数类型,接收两个int类型的参数并且返回一个int类型的返回值
满足相同类型参数和返回值条件的函数都是calculation类型的函数
func add(x, y int) int { //calculation类型的函数
return x + y
}
func sub(x, y int) int { //calculation类型的函数
return x - y
}
add和sub都能赋值给calculation类型的变量
var c calculation //定义calculation类型的变量
c = add //add赋值给c
2.2、函数类型变量
可以声明函数类型变量并且为变量赋值
var c calculation //声明一个calculation类型的变量c
c = add //把add函数作为值赋给c
fmt.Println("c的类型:%T\n",c) // c的类型:main.calculation
fmt.Println(c(1, 2)) //使用c进行函数调用,实际调用的是函数add()
f := add // 将函数add()赋值给一个变量f
fmt.Printf("f的类型:%T\n", f) // c的类型:func(int, int) int
fmt.Println(f(10, 20)) // 调用f实际是在调用add
3、高阶函数
3.1、函数作为参数
func add(x, y int) int {
return x + y
}
func calc(x, y int, op func(int, int) int) int { // 函数作为参数起名为op
return op(x, y)
}
func main() {
ret2 := calc(10, 20, add) // op和函数add的参数、返回值类型都一致,所以可以将add当作值传给op
fmt.Println(ret2) //30
}
3.2、匿名函数作为返回值
func add(x, y int) int {
return x + y
}
func sub(x, y int) int {
return x - y
}
func do(s string) (func(int, int) int, error) { //函数作为返回值,没有函数名
switch s {
case "+":
return add, nil //add函数的参数和返回值都是int
case "-":
return sub, nil sub函数的参数和返回值都是int
default:
err := errors.New("无法识别的操作符")
return nil, err
}
}