Golang中匿名函数的使用

技术文档网 2021-06-01
匿名函数在函数中抽象出来

对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值:

  • 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于一个类,只有它的函数才能读取它的变量,有一个好处是省的写一个函数还得传递参数

  • 实现闭包,闭包就是一个函数内包含另一个子函数,golang就是用匿名函数实现闭包

  • 可以用来实现计数,如返回一个匿名函数,虽然主函数已经结束,但是执行返回的匿名函数,里面的变量仍然可用

  • 节省代码(不用写函数名)

package main

import "fmt"

func main() {
    fmt.Println("this if a function for test anonymous")
    a := 10
    b := 4
    val, err := GetData(a, b, func(a, b int) int { //匿名函数
        return a + b
    })
    if err != nil {
        fmt.Println("err", err)
    }
    fmt.Println("va", val)
}

func GetData(a, b int, f func(x, y int) int) (val int, err error) {
    c := f(a, b)
    val = c - a
    return val, nil
}

func Sum(x, y int) int { //不使用匿名,直接调用函数
    return x + y
}

上面GetData函数中的匿名其实可有可无,那样写,只是为了展示如何使用匿名,匿名就是在调用时,直接在函数参数中声明函数

匿名函数的声明和执行

声明执行是两个过程,申明可以放在函数头,函数中和函数结尾作为返回值 直接声明:

放在函数头参数中:
func GetData(num int, f func (str string)string{
    newstr = fmt.Sprintf("add tag %s", str)
    return newstr
})
放在函数内部:
f = func (str string)string{  //赋给一个变量,f是函数值
    newstr = fmt.Sprintf("add tag %s", str)
    return newstr
}
f("hello world")  //执行
放在函数返回值中:
func GetData() func()int{
    var x int
    return func(x int){
        x = x+1
    }
}
f = GetData()
f()  //执行匿名函数

执行 匿名函数的的执行需要带上括号(),里面存放参数

例如:f()

相关注意

(1)避免循环变量快照

当匿名函数放在循环变量中,和goroutine一起使用时,如果要用到循环变量的值,应该将循环变量作为参数传递进去


for _, f := range filenames {
     go func(f string) {  // 这个f参数必须传递
          //如果f不作为匿名函数的参数,会造成当匿名函数还没读取到f时,for已经进入到下一层循环,造成读取的数据不准确
            _, err := thumbnail.ImageFile(f)
            errors <- err
    }(f)
}

相关文章

  1. Golang中匿名函数的使用

    匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于

  2. Golang中client-server模型

    简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (

  3. 在Leaf中使用Protobuf

    本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务

随机推荐

  1. Golang中匿名函数的使用

    匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于

  2. Golang中client-server模型

    简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (

  3. 在Leaf中使用Protobuf

    本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务