Monkey

个人站

The master has failed more times than the beginner has tried


GO语言中函数

  • 函数是一等公民
    • 可以有多个返回值
    • 所有参数都是值传递:slice , map , channel 会有传引用的错觉
    • 函数可以作为变量的值
    • 函数可以作为参数和返回值
  • 函数多返回值
package fun_test

import (
	"math/rand"
	"testing"
)

func returnMultiValue() (int, int)  {
	return rand.Intn(10) , rand.Intn(20)
}

func TestFun(t *testing.T)  {
	// 函数多个返回值,使用 a, b接收.可以使用 _ 忽略 单个返回值
	a, b := returnMultiValue()
	_, d := returnMultiValue()
	t.Log(a, b, d) // 1 7 19
}
  • 函数执行时间
package fun_test

import (
	"fmt"
	"testing"
	"time"
)
/**
函数执行时间函数
*/
func timeSpent(inner func(op int)int) func(op int) int  {
	return func(n int) int {
		start := time.Now()
		ret := inner(n)
		fmt.Println("time spent :", time.Since(start).Seconds())
		return ret
	}
}

func slowFun(op int) int {
	time.Sleep(time.Second * 1)
	return op
}

func TestFun(t *testing.T)  {
	tsFun := timeSpent(slowFun)
	t.Log(tsFun(10)) // timeSpent 返回值函数的参数
}
/*
    time spent : 1.004648149
--- PASS: TestFun (1.00s)
    func_test.go:20: 10
*/
  • 可变长参数与 defer 延迟运行

    • 可变长参数:不需要指定参数的个数,但是参数的类型是相同的
func sum(ops ...int) int {
    s := 0
    for _, op := range ops {
        s += op
    }
    return s
}
  • defer 函数
func TestDefer(t *testing.T) {
    // 程序运行到此处,不会马上执行。defer 函数,会执行下面的函数,在整体函数返回前,执行 defer 函数
    // 类似于 destruct ,清理资源,释放锁等
    defer func() {
        t.Log("clear resources")
    }() // 调用函数
    t.Log("start")
    // 异常中断,程序停止
    panic("Fatal error") // defer 仍然会执行
}
  • defer 函数示例代码
package fun_test

import (
	"fmt"
	"testing"
)
    
func TestDefer(t *testing.T)  {
	defer Clear()
	fmt.Println("start")
	panic("fatal error")
}
    
func Clear()  {
	fmt.Println("clear resources")
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦