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)
     */
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容