// Go goruntine 调用的方法,避免开启的go 协程异常,导致退出 func Go(x func()) { go func() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() x() }() } func GoParams(x func(interface{}, interface{}), a1, a2 interface{}) { go func() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }() x(a1, a2) }() } Go中 函数的写法大全 //写法1,普通写法(推荐) func div1(a, b int) (int, int) { return a / b, a % b // 返回多个值,此处返回两个数的商和余数 } //写法2,为返回值定义名称,此种方式 仅用于逻辑非常简单的函数 // 多返回值,不能随意使用,一般用法是 第一个为业务返回值,第二个为 错误信息 func div2(a, b int) (q, r int) { q = a / b r = a % b return } //写法3,函数式编程,可以将函数的输入参数定义为函数 func apply(op func(int, int) int, a, b int) int { //获取函数对应的指针 p := reflect.ValueOf(op).Pointer() opName := runtime.FuncForPC(p).Name() fmt.Printf("Calling function %s with args (%d,%d)", opName, a, b) fmt.Println() return op(a, b) } //写法4,可变参数列表 func sum(numbers ...int) int { s := 0 for i := range numbers { s += numbers[i] } return s } //写法5,值传递与 指针传递 //Go 中所有的 参数传递 都是 值传递,但是添加一些操作可以修改为指针传递 // * 代表指针传递 func swap(a, b *int) { *a, *b = *b, *a } // //定义一个匿名函数并直接调用 // func(){ // //函数体 // }() // 匿名函数后面加了()就不仅是类型定义,而且要实例化(需要绑定参数) //匿名函数 1 //f1 为函数地址 f1 := func(x, y int) (z int) { z = x + y return } fmt.Println(f1) fmt.Println(f1(5, 6)) //匿名函数 2 //直接创建匿名函数并运行 f2 := func(x, y int) (z int) { z = x + y return }(7, 8) fmt.Println(f2)