Golang中函数的使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

函数

函数特点

函数的使用

函数定义

函数的参数

函数的返回值

函数的变量作用域

函数的递归调用

函数的可变参数

函数的闭包

函数的 defer 语句

注意


函数

函数调用函数调用时需要传递函数定义中要求的参数并根据需要接收返回值。

匿名函数匿名函数没有函数名可以直接定义并调用。常用于函数内部作为闭包使用。

闭包闭包是指一个函数内部定义的函数它可以访问外部函数的变量并将这些变量与函数绑定形成一个闭合的环境。

可变参数使用 ... 表示可变参数可变参数必须放在函数参数列表的最后面并且只能有一个。

函数作为参数可以将函数作为参数传递给其他函数这种函数称为高阶函数。常用于函数式编程中。

函数作为返回值函数也可以作为返回值这种函数称为闭包。常用于实现类似于装饰器或者切面等功能。

函数特点

1.函数可以有多个返回值。

2.可以将函数作为参数传递给其他函数。

3.可以定义匿名函数。

4.支持闭包。

5.函数可以有多个参数和多个返回值。

6.可以使用可变参数。

函数的使用

函数定义

Go语言中函数的定义使用 func 关键字其基本语法格式如下

func 函数名(参数列表) (返回值列表) {
    函数体
}

其中

  • 函数名 表示函数的名称遵循标识符的命名规则采用驼峰命名法。
  • 参数列表 表示函数的输入参数用逗号分隔每个参数由参数名和参数类型组成如 param1 type1, param2 type2
  • 返回值列表 表示函数的返回值用括号括起来可以是多个返回值如 (type1, type2)
  • 函数体 表示函数的具体实现逻辑。

例如下面是一个计算两个整数之和的函数

func Add(x, y int) int {
    return x + y
}

上述函数名为 Add有两个参数 xy类型都为 int返回值类型为 int函数体内部实现为将 xy 相加并将结果返回。

函数的参数

函数可以有多个参数参数的类型放在参数名的后面如果两个或多个连续的参数的类型相同则可以省略类型例如

func swap(x, y string) (string, string) {
   return y, x
}

函数的返回值

函数可以返回多个值这些值用括号括起来并用逗号分隔。例如

func sum(a int, b int) (int, int) {
   return a+b, a-b
}

可以使用 := 赋值语句来调用函数并自动推断返回值类型

a, b := sum(1, 2)

函数的参数是值传递在函数调用时传递的是实参的副本。

函数的变量作用域

函数中声明的变量作用域是该函数内部在函数外部是不可见的。如果函数中使用了全局变量则在函数中可以直接使用。

函数的递归调用

函数可以递归调用递归调用必须有一个终止条件。例如

func factorial(n uint64) (result uint64) {
   if (n > 0) {
      result = n * factorial(n-1)
      return result
   }
   return 1
}

函数的可变参数

函数的可变参数是一个非常有用的特性可以接受任意数量的参数。在参数列表的最后一个参数之前加上省略号 ... 即可

func sum(numbers ...int) int {
   total := 0
   for _, number := range numbers {
      total += number
   }
   return total
}

函数的闭包

函数的闭包是指函数可以访问其外部作用域中的变量。例如

func main() {
   nextInt := intSeq()

   fmt.Println(nextInt())
   fmt.Println(nextInt())
   fmt.Println(nextInt())

   newInts := intSeq()
   fmt.Println(newInts())
}

func intSeq() func() int {
   i := 0
   return func() int {
      i += 1
      return i
   }
}

以上代码输出

1
2
3
1

函数的 defer 语句

在Go语言中函数的 defer 语句可以在函数返回时执行一些清理工作如关闭文件、解锁资源等。defer 语句可以被插入到函数的任意位置并且可以定义多个 defer 语句。在函数执行时每个 defer 语句都会被压入一个栈中等待函数返回时逆序执行。

func main() {
    defer fmt.Println("deferred")
    fmt.Println("regular")
}

这个程序输出

regular
deferred

在这个例子中当 main 函数执行到 defer 语句时"deferred" 被压入一个栈中。然后程序继续执行输出 "regular"。当函数返回时栈中的 defer 语句被逆序执行最后输出 "deferred"。

除了可以用来清理资源defer 语句还可以用来记录函数的执行时间。下面是一个例子

func timeTrack(start time.Time, name string) {
    elapsed := time.Since(start)
    log.Printf("%s took %s", name, elapsed)
}

func myFunc() {
    defer timeTrack(time.Now(), "myFunc")
    // 函数的实际代码
}

在这个例子中timeTrack 函数用来记录函数的执行时间。在 myFunc 函数中defer 语句被用来调用 timeTrack 函数并传入当前时间和函数名作为参数。当 myFunc 函数返回时timeTrack 函数被执行输出函数的执行时间。

注意

  • 命名规范函数名要有意义采用驼峰命名法首字母大写表示函数是公有的首字母小写表示函数是私有的。
  • 参数传递Go语言函数的参数传递采用值传递如果需要修改传入的参数可以传递指针。
  • 返回值Go语言函数可以返回多个值可以定义返回值的变量名也可以省略变量名但是建议写上变量名方便代码阅读。
  • 错误处理Go语言函数一般都会返回一个error类型的值来表示函数执行是否成功需要在函数调用的地方进行错误处理。
  • 函数变量在Go语言中函数也可以作为变量使用可以将函数赋值给变量也可以作为参数传递给其他函数。
  • defer语句defer语句用于在函数返回前执行一些清理操作例如关闭文件、释放锁等。defer语句的执行顺序是“后进先出”。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go