Go语言之匿名函数

作者: 灰常出色 | 来源:发表于2019-07-19 16:25 被阅读29次

欢迎关注微信号


微信.png

一、Go语言中的匿名函数

指的是不需要有名字的函数,通常定义在另外一个函数内部。

格式:

func (参数列别)(返回值列表) {
}
例子:

package main
import (
    "fmt"
)
func main() {
    Sum := func(l, r int) (sum int) {
        sum = l + r
        return
    }
       // 备注:变量Sum作为匿名函数来使用,求和
        fmt.Println("Hello, sum Address: sum!", &Sum, Sum(50,10))
    return
}
Output:
Hello, sum Address: sum! 0x40c128 60

使用场景:

匿名函数通常比较短小,不希望在这个函数外部使用,这点类似与C++中的lamdba表达式。

补充说明:

匿名函数也可以实现成一个函数数组,使用者可以根据不同的indx来调用不同的匿名函数,这样的话,使用者可以根据自己的需要灵活的使用这些匿名函数。
例子:

package main
import (
    "fmt"
)
func main() {
    funcs := [](func(str string) string){ // 备注:这里面实现了3个不同的函数
        func(str string) string { return "Format 1: " + str },
        func(str string) string { return "Format 2: " + str },
        func(str string) string { return "Format 3: " + str },
    }
    for idx, fun := range funcs {
        fmt.Println("Hello, funcs idx, result:", idx, fun("World"))
    }
    return
}
output:
Hello, funcs idx, result: 0 Format 1: World
Hello, funcs idx, result: 1 Format 2: World
Hello, funcs idx, result: 2 Format 3: World

二、C++中的lambda表达式

C++ 中的lambda表达式是在C++ 11之后才出现的,(备注:这里也只介绍C++ 11)官方文档上说它是闭包类型,笔者个人觉得可以把它理解为一个函数,不过这个函数,有下面一些特性。
1.是函数内部的函数,作用域在这个函数内部,出了该函数之后,不能使用。
2.lambda表达式所表示的函数,是没有名字的。
3.通常这个lambda表达式所做的事情,短小精悍。

为什么我们需要lambda表达式?

笔者觉得lambda表达式之所以存在的主要原因,是因为函数内部的一部分代码,复用率很高,但是也只是在这个函数内部使用,其他函数并不会使用。
这样就导致了一个尴尬的局面,写成一个单独的函数吧,作用范围有些广泛,不写成函数吧,函数内部要写多份相同的代码,于是lambda表达式产生了。

lambda的编译是当作函数来编译的,识别方法是,编译器看到[的时候就知道是lambda表达式了,然后按照lambda表达式的规则来编译。

如何使用lambda表达式?

1.lambda表达式的格式
[ captures ] ( params ) -> ret { body } // 带参数和返回值的表达式
[ captures ] ( params ) { body } // 没有返回值的表达式
[ captures ] { body } // 无参数也无返回值的表达式
captures叫做俘获符,params是形式参数,ret 是返回类型,body表示函数体(备注:captures比较复杂,稍后介绍,其他的都比较容易理解。)

俘获符介绍详细如下所示:


image.png
  1. 例子
  1. . [] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
// Example program
#include <iostream>
#include <string>
int main()
{
  std::string name = "World!";
  auto flag = [](int a, int b) ->bool {return a < b;};
  bool ok = false;
  ok = flag(2, 3);
  std::cout << "Hello, " << name << "flag:"<< ok <<"!\n";
  return 0;
}

OutPut:

Hello, World!flag:1!
image.png

2). [x, &y] //x 按值捕获, y 按引用捕获.


image.png

3). [&] //用到的任何外部变量都隐式按引用捕获


image.png

4). [=] //用到的任何外部变量都隐式按值捕获


image.png

a,b可以在lambda表达式里面读取,但是不可以更改数值。
5). [&, x] //x显式地按值捕获. 其它变量按引用捕获


image.png

6). [=, &z] //z按引用捕获. 其它变量按值捕获


image.png

灰子作于二零一九年七月十八日。

微信公众号 原文链接:https://mp.weixin.qq.com/s?__biz=Mzg3ODI0ODk5OQ==&mid=2247483677&idx=1&sn=c7b947785e3763f12761c4149e10eac0&chksm=cf17d455f8605d43f893d7c98ff3f648be80e52fe3af9ad2fe6edc16deb70897b2f8e57861e5&token=303049926&lang=zh_CN#rd

相关文章

  • Go语言之匿名函数

    欢迎关注微信号 一、Go语言中的匿名函数 指的是不需要有名字的函数,通常定义在另外一个函数内部。 格式: func...

  • go 匿名函数

    Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用1、匿名函数使...

  • Golang基础(五)——函数二

    Golang基础(五)——函数二 @([07] golang)[Go总结] 匿名函数 匿名函数就是将一个函数直接赋...

  • Go匿名函数

    GO语言的匿名函数就是闭包 基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内...

  • Go语言中的匿名函数

    1 什么是匿名函数 在Go语言中,不需要函数名的函数,称为匿名函数。例如正常的函数sayHello()是这样的: ...

  • Golang学习笔记-函数

    Go函数定义格式如下: 例如: Go可以很灵活的创建函数,并作为另外一个函数的实参: Go支持匿名函数,可作为闭包...

  • 第02天(函数、工程管理)_03

    11_函数类型.go 12_回调函数.go 13_匿名函数和闭包.go 14_闭包捕获外部变量的特点.go 15_...

  • golang函数闭包

    定义 Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数...

  • Go 语言函数闭包

    Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。 匿名函数的优越性在于可以直接使用函数内的...

  • Go语言之匿名组合

    一. 概述 Go语言中没有封装,继承,多态的概念,但是可以通过别的方式来实现这些特征 封装:使用方法实现 继承:使...

网友评论

    本文标题:Go语言之匿名函数

    本文链接:https://www.haomeiwen.com/subject/swfehctx.html