如何理解Go函数是一等公民原理及使用场景

 更新时间:2023年07月25日 15:20:49   作者:kert  
这篇文章主要为大家介绍了如何理解Go函数是一等公民及使用场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在接触Go这么语言,可能你经常会听到这样一句话。Go语言中,函数属于一等公民,你可能很费解,什么是一等公民。是因为函数的优先级很高吗?如果是又是怎样的优先级呢?本文将分享Go语言中函数是一等公民的真正面纱。

什么是函数

在了解一等公民之前,先普及一下函数基础知识。函数是执行某种特定功能的代码块,一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能,这里的模块就可以称之为函数。

// 函数的定义
func FunName(变量名 变量类型...) (返回类型...) {
    return 返回值...
}

在Go语言中,函数可以分配给一个变量,可以作为函数的参数,也可以作为函数的返回值。这样的行为就可以理解为函数属于一等公民。

函数使用场景

匿名函数

通过匿名函数的形式,将一个函数分配给一个变量。

package main
import (  
    "fmt"
)
func main() {  
    a := func() {
        fmt.Println("hello world first class function")
    }
    a()
    fmt.Printf("%T", a)
}

在上面的程序中,我们为第 8 行中的变量分配了一个函数。这是将函数分配给变量的语法。如果您仔细注意,分配给的函数没有名称。这些类型的函数称为匿名函数,因为它们没有名称。

也可以调用匿名函数而不将其分配给变量。让我们在下面的示例中看看这是如何完成的。

package main
import (  
    "fmt"
)
func main() {  
    func() {
        fmt.Println("hello world first class function")
    }()
}

在上面的程序中,在第 8 行中定义了一个匿名函数,紧接着函数定义之后,我们使用第10行("()")调用该函数。

自定义函数类型

就像我们定义自己的结构类型一样,也可以定义自己的函数类型。

type add func(a int, b int) int

上面的代码片段创建了一个新的函数类型,它接受两个整数参数并返回一个整数。现在我们可以定义类型的变量。

package main
import (  
    "fmt"
)
type add func(a int, b int) int
func main() {  
    var a add = func(a int, b int) int {
        return a + b
    }
    s := a(5, 6)
    fmt.Println("Sum", s)
}

在上面的程序中,在第 10 行,我们定义了一个变量 type,并为其赋值一个签名与类型匹配的函数。我们调用第 13 行中的函数并将结果分配给s变量。将打印结果:

Sum 11

函数作为参数

在Go语言中,也是支持将函数作为另外一个函数的参数进行传递。

package main
import (  
    "fmt"
)
func simple(a func(a, b int) int) {  
    fmt.Println(a(60, 7))
}
func main() {  
    f := func(a, b int) int {
        return a + b
    }
    simple(f)
}

在上面的示例中,在第 7 行中,我们定义了一个函数,该函数接受一个接受两个 int 参数并返回一个 int 作为参数的函数。在第 12 行的 main 函数中,我们创建了一个匿名函数,其签名与函数的参数匹配。我们在下一行中调用 and 传递作为参数。

函数作为返回值

在Go语言中,也可以将函数作为另外一个函数的返回值进行传递。

package main
import (  
    "fmt"
)
func simple() func(a, b int) int {  
    f := func(a, b int) int {
        return a + b
    }
    return f
}
func main() {  
    s := simple()
    fmt.Println(s(60, 7))
}

在上面的程序中,第 7 行中的简单函数返回一个函数,该函数接受两个参数并返回。

闭包

闭包是匿名函数的特例。闭包是匿名函数,用于访问在函数主体外部定义的变量。

package main
import (  
    "fmt"
)
func main() {  
    a := 5
    func() {
        fmt.Println("a =", a)
    }()
}

在上面的程序中,匿名函数访问变量,该变量存在于其主体之外的第 10 行。因此,这个匿名函数是一个闭包。

实战演示

上面提到了一些函数相关的知识,这里以函数作为形参演示一个demo。

将函数作为参数,将数组中的每一个元素都 * 5。

package main
import "fmt"
func sum(array [3]int, f func(int)int) [3]int {
    newArray := [3]int{0, 0, 0}
    for k, v := range array {
        newArray[k] = f(v)
    }
    return newAarray
}
func main() {
    a := [3]int{1, 2, 3}
    sum(a, func(n int) int {
        return n * 5
    })
}

以上就是如何理解Go函数是一等公民原理及使用场景的详细内容,更多关于Go函数一等公民的资料请关注脚本之家其它相关文章!

相关文章

  • go程序部署到linux上运行的实现方法

    go程序部署到linux上运行的实现方法

    本文主要介绍了go程序部署到linux上运行的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • golang使用sort接口实现排序示例

    golang使用sort接口实现排序示例

    这篇文章主要介绍了golang使用sort接口实现排序的方法,简单分析了sort接口的功能并实例演示了基于sort接口的排序实现方法,需要的朋友可以参考下
    2016-07-07
  • go sync.Once实现高效单例模式详解

    go sync.Once实现高效单例模式详解

    这篇文章主要为大家介绍了go sync.Once实现高效单例模式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    这篇文章主要为大家介绍了GoFrame gredis干货DoVar Conn连接对象自动序列化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言const&iota的实现示例

    Go语言const&iota的实现示例

    本文主要介绍了Go语言const&iota的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • Golang中println和fmt.Println区别解析

    Golang中println和fmt.Println区别解析

    Golang 中打印数据通常使用 fmt.Println() 方法,也可以使用内置的 println() 方法。这两个方法大家可能都使用过,它们的区别是什么呢?本文给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2023-03-03
  • Go语言利用excelize库自动化操作Excel的实战指南

    Go语言利用excelize库自动化操作Excel的实战指南

    这篇文章主要为大家详细介绍了如何使用Go语言自动化操作Excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下吧
    2026-03-03
  • Go中变量命名规则与实例

    Go中变量命名规则与实例

    命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名,下面这篇文章主要给大家介绍了关于Go中变量命名的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • go如何使用cobra启动项目

    go如何使用cobra启动项目

    本文介绍了如何使用Go语言的Cobra库来启动项目,包括基本使用和项目开发中的具体实现,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • Go语言入门教程之基础语法快速入门

    Go语言入门教程之基础语法快速入门

    这篇文章主要介绍了Go语言入门教程之基础语法快速入门,本文讲解了值类型、变量、常量、循环、条件语句、条件枚举等内容,需要的朋友可以参考下
    2014-11-11

最新评论