Go有关方法的笔记(掌握defer与闭包)

本文介绍了Go语言中关于不定参数的使用,以及闭包和延迟调用(通过`defer`实现)的概念,强调了闭包可能导致的内存泄露问题,并通过实例展示了不同情况下的defer执行顺序。
摘要由CSDN通过智能技术生成

不定参数

Go 支持不定参数。不定参数是指最后一个参数可以传入任意多个值。
注意必须是最后一个参数才可以声明为不定参数。
不定参数在方法内部可以被当成切片来使用
Option 模式大量应用了不定参数。

//一个人可能有很多个别名,也可能一个都没有
func YourName(Name string,alias ...string){ 
	if len(alias)>0 {
		println(alias[0])
	}
}

闭包

闭包(closure),方法+它绑定的运行上下文

func Closure(name string) func() string{
	//返回的这个函数,就是一个闭包。
	//它引用到了 Closure 这个方法的入参
	return func()string {
		return "hello,"+ name
	}
}

闭包如果使用不当可能会引起内存泄露的问题。即一个对象被闭包引用的话,它是不会被垃圾回收的。(面试常问)

延迟调用

defer,允许在方法返回的前一刻,执行一段逻辑。
defer类似于栈,也就是后进先出。也就是,先定义的后执行;后定义的先执行。

闭包与延迟调用

func DeferClosure() {
	i := 0
	defer func() {
		println(i)
	}()
	i = 1
}
// 输出1

func DeferClosure1() {
	i := 0
	defer func(val int) {
		println(val)
	}(i)
	i = 1
}
// 输出0

作为参数传入的:定义 defer 的时候就确定了。
作为闭包引入的:执行 defer 对应的方法的时候才确定。

func DeferReturn() int {
	a := 0
	defer func() {
		a = 1
	}()
	return a
}
// println(DeferReturn())
// 0

func DeferReturnV1() (a int) {
	defer func() {
		a = 1
	}()
	return a
}
// println(DeferReturnV1())
// 1

type MyStruct struct {
	name string
}

func DeferReturnV2() *MyStruct {
	a := &MyStruct{
		name: "Jerry",
	}
	defer func() {
		a.name = "Tom"
	}()
	return a
}
//println(DeferReturnV2().name)
//Tom

练习题:

func DeferReturn() {
	for i := 0; i < 10; i++ {
		defer func() {
			print(i)
		}()
	}
	println()
}


func DeferReturnV1() {
	for i := 0; i < 10; i++ {
		defer func(val int) {
			print(val)
		}(i)
	}
	println()
}


func DeferReturnV2() {
	for i := 0; i < 10; i++ {
		j := i
		defer func() {
			print(j)
		}()
	}
	println()
}

答案

10101010101010101010
9876543210          
9876543210   
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值