Go语言入门之函数的定义与使用

 更新时间:2022年11月01日 16:48:55   作者:宇宙之一粟  
函数是一段代码的片段,包含连续的执行语句,它可以将零个或多个输入参数映射到零个或多个参数输出。本文将通过示例和大家详细聊聊Go语言中函数的定义与使用,感兴趣的可以了解一下

1.前言

函数是一段代码的片段,包含连续的执行语句,它可以将零个或多个输入参数映射到零个或多个参数输出。函数像一个黑盒,对它的使用者隐藏实现细节。还可以在代码中通过函数调用来执行它们。

学到现在,我们使用的 Go 函数只有 main 函数:

func main() {
}

2.函数声明

每个函数都包含 func 关键字、函数名、输入参数列表、一个可选的返回列表以及函数体

func name(parameter-list) (result-list) {
    function body
}
  • func 关键字:Go 语言使用 func 关键字来声明一个函数。类似 Python 的 def 关键字。
  • 函数名:紧跟 func 关键字后的事函数名称,函数名必须是一个标识符,即不能跟 Go 语言关键字冲突
  • 输入参数列表(形参列表):输入参数声明列表必须用一对小括号括起来,指定一组变量的参数名参数类型,这些局部变量都由调用者提供的实参传递而来。
  • 输出结果列表(返回列表):指定了函数返回值的类型。当函数返回一个未命名的返回值或者没有返回值的时候,返回列表的圆括号可以省略。在 Go 中,一个函数可以有多个返回值。
  • 函数体:函数体必须用一对大括号括起来。一对大括号和它其间的代码形成了一个显式代码块。在一个函数体内, return 关键字可以用来结束此函数的正常执行流程并进入此函数的退出阶段。

2.1 函数例子

接下来,看一个简单的 Go 整数计算器的 加、减、乘、除 函数的例子。

package main

import "fmt"

func add(num1 int, num2 int) (num3 int) {
    num3 = num1 + num2
    return
}

func subtract(num1 int, num2 int) int {

    num3 := num1 - num2
    return num3
}

func multiply(num1 int, num2 int) int {
    result := num1 * num2
    return result
}

func divide(num1 int, num2 int) (result int) {
    if num2 != 0 {
        result = num1 / num2
    } else {
        panic("division by zero")
    }
    return result
}

func main() {

    fmt.Printf("2021 + 19 = %d\n", add(2021, 19))
    fmt.Printf("2021 - 19 = %d\n", subtract(2021, 19))
    fmt.Printf("2021 * 19 = %d\n", multiply(2021, 19))
    fmt.Printf("2021 / 19 = %d\n", divide(2021, 19))
    // fmt.Printf("2021 / 0 = %d\n", divide(2021, 0))
}

结果为:

2021 + 19 = 2040
2021 - 19 = 2002
2021 * 19 = 38399
2021 / 19 = 106

如果我们除以 0 的话,调用了一个叫做 panic 的内置函数,该函数会导致一个运行时的错误。还会得到一个异常,异常也会在接下来的博客中学习到。

panic: division by zero

goroutine 1 [running]:
main.divide(...)
...

2.2 Go 函数支持多返回值

Go 支持一个函数返回多个值:

func f() (int, int){
    return 2014, 2021
}

func main() {
    x, y := f()
}

这里需要做三个改变:

  • 返回类型改变:多个返回类型用多个逗号,分隔的类型,
  • 改变 return 后的表达式:使其包含多个逗号, 的表达式,
  • 最后改变赋值语句,使多个值都在 :== 的左边

多个返回值一般用于返回 error,例如 (x, err := f()) , 或者返回一个布尔值表示成功,如 (x, ok := f()) .

2.3 变量函数

对于 Go 函数中的最后一个参数,有一种特殊的形式可以使用:

func add(args ...int) int {
    total := 0
    for _, v := range args {
        total += v
    }
    return total
}

func main() {
    fmt.Println(add(1,2,3))
}

通过在最后一个参数的类型名称前使用 ... ,你可以表示它需要零个或多个这些 参数。在这种情况下,我们需要零个或多个整数。我们像其他函数一样调用该函数,而且可以传递我们想要的任何数量的变量。

这正是 fmt.Println 函数的实现方式:

func Println(a ...interface{}) (n int, err error)

Println() 函数可以接受任何数量的任何类型的值。我们也可以通过在 slice 后面加上 ... 来传递一个 ints 的 slice 。

func main() {
    s1 := []int{1,2,3}
    fmt.Println(add(s1...))
}

2.4 闭包

可以在函数内部创建函数。

func main() {
    add := func(x, y int) int {
        return x + y
    }
    fmt.Println(add(1,1))
}

add 是一个局部变量,其类型为 func(int, int) int(一个函数接收两个 int 参数,并返回一个 int 参数)。当你创建一个像这样的局部函数时,它还可以访问其他局部变量。

2.5 递归

最后,一个函数能够调用自己。下面是一种方法来计算一个数字的阶乘。

package main

import "fmt"

func factorial(x uint) uint {
    if x == 0 {
        return 1
    }

    return x * factorial(x-1)
}

func main() {
    fmt.Println(factorial(4))
}

闭包和递归是强大的编程技术,它构成了被称为函数式编程的范式的基础。大多数人都会发现函数式编程比以下方法更难理解:for 循环、if 语句、变量和简单函数的方法。

3.总结

  • 声明函数需要提供函数名、形参列表和返回值列表
  • 名称中首字母大写的函数和类型将被导出并为其他包所用
  • 函数声明中的每个形参和返回值都由名字后跟类型组成,如果多个形参或者返回值具有相同的类型,那么类型只需要给出一次即可。
  • 函数声明中的返回值也可以省略名字,而只给出类型
  • 调用函数时需要根据其接受的形参给予相应的实参,至于函数的执行结果则会通过关键字 return 返回给调用者。

以上就是Go语言入门之函数的定义与使用的详细内容,更多关于Go语言 函数的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈Golang数据竞态

    浅谈Golang数据竞态

    本文主要介绍了浅谈Golang数据竞态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go 语言数据结构如何实现抄一个list示例详解

    Go 语言数据结构如何实现抄一个list示例详解

    这篇文章主要为大家介绍了Go 语言数据结构如何实现抄一个list示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • go get 和 go install 对比介绍

    go get 和 go install 对比介绍

    go install和go get都是Go语言的工具命令,但它们之间有一些区别。go get:用于从远程代码存储库(如 GitHub)中下载或更新Go代码包。go install:用于编译并安装 Go 代码包,本文go get和go install对比介绍的非常详细,需要的朋友可以参考一下
    2023-04-04
  • Go语言获取文件的名称、前缀、后缀

    Go语言获取文件的名称、前缀、后缀

    这篇文章主要介绍了Go语言获取文件的名称、前缀、后缀,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go项目中添加生成时间与版本信息的方法

    Go项目中添加生成时间与版本信息的方法

    本文主要介绍了Go项目中添加生成时间与版本信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 谈谈Go语言的反射三定律

    谈谈Go语言的反射三定律

    本文中,我们将解释Go语言中反射的运作机制。每个编程语言的反射模型不大相同,很多语言索性就不支持反射(C、C++)。由于本文是介绍Go语言的,所以当我们谈到“反射”时,默认为是Go语言中的反射。
    2016-08-08
  • Golang 高效排序数据详情

    Golang 高效排序数据详情

    本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。
    2021-11-11
  • golang gorm 结构体的表字段缺省值设置方式

    golang gorm 结构体的表字段缺省值设置方式

    这篇文章主要介绍了golang gorm 结构体的表字段缺省值设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang 检查网络状态是否正常的方法

    golang 检查网络状态是否正常的方法

    今天小编就为大家分享一篇golang 检查网络状态是否正常的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Golang Fasthttp选择使用slice而非map 存储请求数据原理探索

    Golang Fasthttp选择使用slice而非map 存储请求数据原理探索

    本文将从简单到复杂,逐步剖析为什么 Fasthttp 选择使用 slice 而非 map,并通过代码示例解释这一选择背后高性能的原因,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02

最新评论