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

目录
  • 1.前言
  • 2.函数声明
    • 2.1 函数例子
    • 2.2 Go 函数支持多返回值
    • 2.3 变量函数
    • 2.4 闭包
    • 2.5 递归
  • 3.总结

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语言 函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言中的函数详解

    1.函数的声明定义 //func关键字 //getStudent函数名 //(id int, classId int) 参数列表 //(name string,age int) 返回值列表 func getStudent(id int, classId int)(name string,age int) { //函数体 if id==1&&classId==1{ name = "BigOrange" age = 26 } //返回值 return name, age /

  • 深入了解Go语言的基本语法与常用函数

    目录 一.基本语法 标识符命名规范 变量的定义与使用 定义常量 二.常用函数 main 函数与 init 函数 fmt 包及其函数 一.基本语法 标识符命名规范 Go 是区分大小写的,标识符的命名包含了 Go 中变量.常量.函数.结构体.接口以及方法的命令,Go 限定任何需要对外暴露的标识符必须以大写字母开头,不需要对外暴露的标识符则需要以小写字母开头. 标识符以大写开头,就表示可以被外部包的代码引用,称之为导出.如果以小写字母开头,那么对外就是不可见的,但是在整个包的内部是可见且可用的. 标识

  • go语言中函数与方法介绍

    在C#或者Java里面我们都知道,一个Class是要包含成员变量和方法的,对于GO语言的Struct也一样,我们也可以给Struct定义一系列方法. 一.怎么定义一个方法? Go的方法是在函数前面加上一个接收者,这样编译器就知道这个方法属于哪个类型了.例如: package demo1 import ( "fmt" ) type Student struct { Name string Age int Class string } func (stu Student) GetUserI

  • 一文了解Go语言中的函数与方法的用法

    目录 函数定义语法 函数定义示例 无返回值函数 单一返回值函数 多返回值函数 方法(Method)定义 方法(Method)示例 基本类型 结构体类型 函数定义语法 与大部分语言一致,Go语言中的函数定义与其他语言基本一致 func function_name(Parameter-list) { // function body... } func function_name(Parameter-list) Return-Type { // function body... } func fun

  • Go编译原理之函数内联

    目录 前言 函数内联概述 函数内联底层实现 visitBottomUp caninl inlcalls 前言 在前一篇文章中分享了编译器优化的变量捕获部分,本文分享编译器优化的另一个内容—函数内联.函数内联是指将将较小的函数内容,直接放入到调用者函数中,从而减少函数调用的开销 函数内联概述 我们知道每一个高级编程语言的函数调用,成本都是在与需要为它分配栈内存来存储参数.返回值.局部变量等等,Go的函数调用的成本在于参数与返回值栈复制.较小的栈寄存器开销以及函数序言部分的检查栈扩容(Go语言中的栈

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

    目录 1.前言 2.函数声明 2.1 函数例子 2.2 Go 函数支持多返回值 2.3 变量函数 2.4 闭包 2.5 递归 3.总结 1.前言 函数是一段代码的片段,包含连续的执行语句,它可以将零个或多个输入参数映射到零个或多个参数输出.函数像一个黑盒,对它的使用者隐藏实现细节.还可以在代码中通过函数调用来执行它们. 学到现在,我们使用的 Go 函数只有 main 函数: func main() { } 2.函数声明 每个函数都包含 func 关键字.函数名.输入参数列表.一个可选的返回列表以

  • C语言入门篇--函数及数组用法

    目录 函数 1.函数的作用 2.函数的构成 (1)返回值 (2)函数名 (3)形参列表 (4)函数体 数组 1.定义数组 1.1不进行初始化 1.2进行初始化 1.3不给定数组元素个数 2.数组的经典用法 2.1求数组大小.元素大小.元素个数 2.2遍历 面向过程编程:C语言是面向过程的语言:在C语言中,把大部分的功能以一个个函数呈现,就称之为面向过程编程: 函数 是面向过程编程最关键的语法结构. 1.函数的作用 1.从工程上讲,函数可以让我们的代码更具有结构性,让代码更好看. 2.函数可以提升

  • Go语言学习之函数的定义与使用详解

    目录 1.函数定义 2.多值返回 3.引用传递 4.函数作为实参使用 5.匿名函数 1.函数定义 函数的定义和java一样,使用{}进行包裹,并且要明确入参类型以及返回类型. 样例代码如下: func min(num1, num2 int) int { if num1 <= num2 { return num1 } else { return num2 } } func main() { fmt.Printf("max = %d\n", min(10, 12)) } 执行结果 m

  • C语言入门篇--变量[定义,初始化赋值,外部声明]

    1.变量 变量即变化的量. C语言中用 常量 来表示不变的值,用 变量 表示变化的值. eg:输出26个字母 #include <stdio.h> int main() { char c = 'A';//定义一个为char类型的变量c,并对其进行初始化 for (; c <='Z'; c++) { printf("%c", c); } printf("\n"); return 0; } 2.变量的定义 int temp; int age = 21;

  • C语言入门篇--定义宏#define的概述

    目录 1.什么是宏 2.为什么要有宏? 3.宏的用法 3.1定义宏 3.2宏常量 3.3"宏函数" 1.什么是宏 宏只做简单的文本替换,但一般在作为变量名出现或者在字符串中出现中是不会被替换的. 2.为什么要有宏? (1)便于代码的可维护性,对宏的内容进行修改,即可修改代码中所有用到此宏地方的内容. (2)方便阅读,见名知意. 3.宏的用法 3.1定义宏 格式: #define 标识符 内容 3.2宏常量 #include <stdio.h> #define M 1 int

  • C语言入门学习之fgets()函数和fputs()函数

    目录 fgets()函数 fputs()函数 总结 fgets()函数 fgets()函数和gets()函数一样,都是读取字符串,不过gets()函数通常用来从键盘读取输入的字符串,fgets()函数可以通过文件来读取字符串.下面通一个例子来演示fgets()函数的使用方法. int main() { FILE *in,*out; int ret; char ch; char str1[30],str2[30],str3[30]; /* 打开文件 */ in = fopen("123.txt&q

  • Oracle PL/SQL语言入门基础

    正在看的ORACLE教程是:Oracle PL/SQL语言入门基础.PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL

  • C语言入门的一些基本资源推荐和程序语法概览

    为什么要学习C语言? 为什么要学习.使用C语言?为什么要学习一个可能比自己都岁数大的编程语言? 选择一门编程语言,"为什么而学"这个目的是最重要的,目的不明确就没法学好.这也是为什么很多学生朋友在大学里必修C语言却觉得没学明白的原因.因为学习的目的不明确,学习当然也没有动力.还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需要中产生,伴随着Unix的兴起而流行,语义简明清晰,功能强大而不臃肿,简洁而又不过分简单,实在是居家旅行工作学习必备

  • Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义方式: 函数的文字说明: 为了让别人了解函数的意义,或者避免自己遗忘,可以使用 字符串(不需要赋值,单引号,双引号,多引号都行).#注释 将文字说明写在函数最开始的位置 def function1() : """ 这是这个程序的说明文字 """ pr

  • C语言入门篇--关键字static详解

    目录 1.修饰局部变量 1.1作用 1.2举例 (1)不加static (2)加static (3)静态局部变量的初始化只会进行一次 2.修饰全局变量 2.1作用 2.2举例 (1)不加static (2)加static 3.修饰函数 3.1作用 3.2举例 (1)不加static (2)加static 1.修饰局部变量 1.1作用 ststic修饰局部变量,会改变局部变量的生命周期,不改变作用域: 生命周期:和全局变量一样具有全局性,但在内存中的位置没有改变,还在在静态存储区中. 作用域:作用

随机推荐