go语言中fn是什么

小老鼠
小老鼠原创
2023-04-17 11:51:11245浏览

go语言中fn具体指的是关键字func,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块,函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。

本教程操作系统:Windows10系统、GO1.20版、Dell G3电脑

Go语言函数声明(函数定义)

函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段,其可以提高应用的模块性和代码的重复利用率。Go 语言支持普通函数、匿名函数和闭包,从设计上对函数进行了优化和改进,让函数使用起来更加方便。

函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。

因为Go语言是编译型语言,所以函数编写的顺序是无关紧要的,鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。

编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务来解决,而且,同一个任务(函数)可以被多次调用,有助于代码重用(事实上,好的程序是非常注意 DRY 原则的,即不要重复你自己(Don't Repeat Yourself),意思是执行特定任务的代码只能在程序里面出现一次)。

当函数执行到代码块最后一行}之前或者 return 语句的时候会退出,其中return语句可以带有零个或多个参数,这些参数将作为返回值供调用者使用,简单的return语句也可以用来结束for的死循环,或者结束一个协程(goroutine)。

Go语言函数不需要声明

Go语言的函数是一等公民,和变量一样,可以赋值给某一变量(匿名函数产生的原因)

由于函数是一等公民, 所以以前定义变量所有的格式, 都可以用于定义函数类型的变量

    var 变量名称 函数类型
    var 变量名称 函数类型 = 匿名函数
    var 变量名称  = 匿名函数
    变量名称  := 匿名函数
    var(
        var 变量名称  = 匿名函数
    )
fn = func (a,b int){
    return a + b
}
fn()

Go语言中函数变量定义的方式和C语言不一样

格式: func函数名称( 形参列表 ) 返回值列表{}

Go语言中函数返回值可以不止一个

func test(a,b int) (a,b int){
    return a,b
}

Go语言函数返回值可以只写类型,也可以写变量+类型

只写类型:func test(a,b int) (int){} 注意:只写类型,返回值类型int两边的括号可以省略

变量加类型:func test(a,b int) (a,b int){}
注意点:当写变量+类型的形式时,return可以不加返回值,会自动寻找代码块的a和b

func test(a,b int) (a,b int){
      a = 100
      b = 99
      return //自动返回100,99}

Go语言形参列表或者返回值列表的类型如果相同,那么我们可以连续定义
如下:两个函数表示同一种方法

func test(a,b int) (a,b int){return a,b}
func test2(a int,b int) (int,int){return a,b}

由于Go语言函数可以有多个返回值,那么外界接收函数多个返回值的时候需要用多个变量来接收,但是Go语言中变量不使用会报错,所以我们如果有一个返回值不需要使用时,我们会用 _ 来接收, _ 在Go语言中有特定的含义,所以不能用作变量的标识符

匿名函数

匿名函数就是没有名称的函数,定义后需要立即使用否则会报错

匿名函数通常情况只用做一次,由于是一等公民,可以作为函数的形参或者作为函数的返回值

作为函数的形参

fn  := func (a,b int) int {
  return a + b
}

//此时调用test函数用来计算a+b可以这么写
res := test(a,b,fn)

func test(a,b int,method func(int,int) int) func() {
  return method(a,b)
}

进一步演变

由于fn和是匿名函数赋值,所以我们可以直接将匿名函数传入test

//此时调用test函数用来计算a+b可以这么写
res := test(a,b,func (a,b int) int {
  return a + b
})

func test(a,b int,method func(int,int) int) func() {
  return method(a,b)
}

作为函数的返回值

fn := test()
fn()//打印匿名函数

func test() func() {
    return func() {
        fmt.Println("匿名函数")
    }
}

闭包(特殊的匿名函数)

返回的匿名函数中如果用到了外界的变量,那么就称为闭包

闭包的特点:"人在塔在"只要返回的匿名函数中用到了外界的变量,那么如果函数调用后还有使用到此匿名函数的情况,那么函数栈不会释放,一旦不再使用,函数栈才释放

fn := test()//test函数也被称为迭代器
fn()  //2
fn()  //3
fn()  //4

func test() func(){
     x := 1
     return func (){
            x++
            println(x)
        }
}

匿名函数的内存表现

QQ截图20230417114047.png

图解

  1. 代码区存放了三个函数的代码,对应有一个地址

  2. 定义变量fn,将匿名函数的地址传给了fn

  3. 调用函数test开辟存储空间

  4. 为num,value,method,res开辟存储空间,其中method保存传给它的函数的地址

  5. 执行函数,method保存了匿名函数的地址,执行method的时候开辟了存储空间,存放了a和b的值,函数结束后将值返回给res,并释放了method的存储空间

  6. 打印了res,test的函数也被释放,fn使用完毕也被释放

以上就是go语言中fn是什么的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。