Golang 启动Go 协程的使用技巧
// 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)