go语言—函数进阶

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
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值