Go的函数及可变参数和defer

函数是一等公民:

  • 可以有多个返回值
  • 所有参数都是值传递:slicemapchannel 会有传引用的错觉
  • 函数可以作为变量的值
  • 函数可以作为参数和返回值
func returnMultiValues() (int, int) {
	// 返回两个值
	return rand.Intn(10), rand.Intn(20)
}

func TestFn(t *testing.T) {
	a, b := returnMultiValues()
	t.Log(a, b) // 1 7
}

可变参数:

func Sum(ops ...int) int {
	ret := 0
	for _, op := range ops {
		ret += op
	}
	return ret
}

func TestVarParams(t *testing.T) {
	t.Log(Sum(1, 2, 3, 4))
	t.Log(Sum(1, 2, 3, 4, 5))
	/** 运行结果
	=== RUN   TestVarParams
	    TestVarParams: func_test.go:48: 10
	    TestVarParams: func_test.go:49: 15
	--- PASS: TestVarParams (0.00s)
	 */
}

defer:

在最后执行完执行,通常我们用于释放资源及释放锁

func TestDefer(t *testing.T) {
	defer func() {
		t.Log("Clean resources")
	}()
	t.Log("Started")
	// panic 手动触发宕机
	panic("Fatal error") // defer 仍然会执行
	/** 运行结果
	=== RUN   TestDefer
	    TestDefer: func_test.go:56: Started
	    TestDefer: func_test.go:54: Clean resources
	--- FAIL: TestDefer (0.00s)
	 */
}
展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值