Golang中匿名函数的使用
对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值:
在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于一个类,只有它的函数才能读取它的变量,有一个好处是省的写一个函数还得传递参数
实现闭包,闭包就是一个函数内包含另一个子函数,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)
}
相关文章
- Golang中匿名函数的使用
匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于
- Golang中client-server模型
简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (
- 在Leaf中使用Protobuf
本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务
随机推荐
- Golang中匿名函数的使用
匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于
- Golang中client-server模型
简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (
- 在Leaf中使用Protobuf
本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务