函数构成了代码执行的逻辑结构,

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

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

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

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

Go语言里的三种类型函数

  • 普通标准函数https://blog.csdn.net/xyz/article/details//120027722https://blog.csdn.net/xyz/article/details//120027722
  • 匿名函数或者 lambda 函数https://blog.csdn.net/xyz/article/details/120027880https://blog.csdn.net/xyz/article/details/120027880
  • (结构体|类)方法https://blog.csdn.net/xyz/article/details/120003061https://blog.csdn.net/xyz/article/details/120003061

定义标准函数

定义标准函数的基本格式

函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。

func 函数名(形式参数列表)(返回值列表){函数体
}
  • 形式参数列表描述了函数的参数名以及参数类型,这些参数作为局部变量,其值由调用者提供
  • 返回值列表描述了函数返回值的变量名以及类型,如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。

如果一个函数声明不包括返回值列表,那么函数体执行完毕后,不会返回任何值,在下面的 hypot 函数中:

func hypot(x, y float64) float64 {return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3,4)) // "5"

x 和 y 是形参名,3 和 4 是调用时的传入的实数,函数返回了一个 float64 类型的值,返回值也可以像形式参数一样被命名,在这种情况下,每个返回值被声明成一个局部变量,并根据该返回值的类型,将其初始化为 0。

如果一个函数在声明时,包含返回值列表,那么该函数必须以 return 语句结尾,除非函数明显无法运行到结尾处,例如函数在结尾时调用了 panic 异常或函数中存在无限循环。

正如 hypot 函数一样,如果一组形参或返回值有相同的类型,我们不必为每个形参都写出参数类型,下面 2 个声明是等价的:

func f(i, j, k int, s, t string) { /* ... */ }
func f(i int, j int, k int, s string, t string) { /* ... */ }

下面,我们给出 4 种方法声明拥有 2 个 int 型参数和 1 个 int 型返回值的函数,空白标识符可以强调某个参数未被使用。

func add(x int, y int) int   { return x + y }
func sub(x, y int) (z int)   { z = x - y; return }
func first(x int, _ int) int { return x }
func zero(int, int) int      { return 0 }
fmt.Printf("%T\n", add) // "func(int, int) int"
fmt.Printf("%T\n", sub) // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero) // "func(int, int) int"

函数的类型被称为函数的标识符,如果两个函数形式参数列表和返回值列表中的变量类型一一对应,那么这两个函数被认为有相同的类型和标识符,形参和返回值的变量名不影响函数标识符也不影响它们是否可以以省略参数类型的形式表示。

函数参数特殊说明

函数参数的顺序

  • go不支持overload

  • 调用函数时实参必须按照形参的类型顺序传递参数

每一次函数在调用时都必须按照声明顺序为所有参数提供实参(参数值),在函数调用时,Go语言没有默认参数值,也没有任何方法可以通过参数名指定形参,因此形参和返回值的变量名对于函数调用者而言没有意义。

函数参数的传递类型{值传递和引用传递}

  • 在函数中,实参通过值传递的方式进行传递,因此函数的形参是实参的拷贝,对形参进行修改不会影响实参
  • 如果实参包括引用类型,如指针、slice(切片)、map、function、channel 等类型,实参可能会由于函数的间接引用被修改

函数的返回值

Go语言支持多返回值,多返回值能方便地获得函数执行后的多个返回参数,Go语言经常使用多返回值中的最后一个返回参数返回函数执行中可能发生的错误,示例代码如下:

函数返回0个或多个返回值

  1. 函数没有返回值
  2. 函数返回单个值​​​​​​​
  3. 函数返回多个值 

函数返回值设定别名

纯类型的返回值对于代码可读性不是很友好,特别是在同类型的返回值出现时,无法区分每个返回参数的意义。

Go语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型。

命名的返回值变量的默认值为类型的默认值,即数值为 0,字符串为空字符串,布尔为 false、指针为 nil 等。

下面代码中的函数拥有两个整型返回值,函数声明时将返回值命名为 a 和 b,因此可以在函数体中直接对函数返回值进行赋值,在命名的返回值方式的函数体中,在函数结束前需要显式地使用 return 语句进行返回,代码如下:

func namedRetValues() (a, b int) {a = 1b = 2return
}

代码说明如下:

  • 第 1 行,对两个整型返回值进行命名,分别为 a 和 b。
  • 第 3 行和第 4 行,命名返回值的变量与这个函数的布局变量的效果一致,可以对返回值进行赋值和值获取。
  • 第 6 行,当函数使用命名返回值时,可以在 return 中不填写返回值列表,如果填写也是可行的,下面代码的执行效果和上面代码的效果一样。
    func namedRetValues() (a, b int) {a = 1return a, 2
    }

同一种类型返回值和命名返回值两种形式只能二选一,混用时将会发生编译错误,例如下面的代码:

func namedRetValues() (a, b int, int)

编译报错提示:

mixed named and unnamed function parameters

意思是:在函数参数中混合使用了命名和非命名参数。

调用函数

函数在定义后,可以通过调用的方式,让当前代码跳转到被调用的函数中进行执行,调用前的函数局部变量都会被保存起来不会丢失,被调用的函数运行结束后,恢复到调用函数的下一行继续执行代码,之前的局部变量也能继续访问。

函数内的局部变量只能在函数体中使用,函数调用结束后,这些局部变量都会被释放并且失效。

Go语言的函数调用格式如下:

返回值变量列表 = 函数名(参数列表)

下面是对各个部分的说明:

  • 函数名:需要调用的函数名。
  • 参数列表:参数变量以逗号分隔,尾部无须以分号结尾。
  • 返回值变量列表:多个返回值使用逗号分隔。

例如,加法函数调用样式如下:

result := add(1,1)

​​​​​​​

Go语言-基础知识-第6章-【func 函数】函数定义相关推荐

  1. 第一章c语言基础知识答案,第一章 C语言的基础知识练习题

    第一章 C语言的基础知识练习题 第一章 C语言的基础知识 第一节 对C语言的初步认识 习题 1. 下列叙述中错误的是 B A)任何一个C程序都必须有且仅有一个main函数,C语言总是从main函数开始 ...

  2. .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

  3. 嵌入式C语言基础知识查漏补缺--内存管理函数指针数组

    内存管理: 堆和栈的理解和区别 局部变量 静态局部变量 全局变量 静态全局变量 作用域 在定义变量的{}之内有效 在定义变量的{}之内有效 整个工程,所有文件 当前文件 生命周期 程序运行至变量定义处 ...

  4. c打印无符号整数_C语言基础知识:printf的输出格式,C/C++语言编程讲解

    C语言基础知识:printf的输出格式 printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为 ...

  5. android studio如何设置输出值的小数点_C语言基础知识:printf的输出格式,C/C++语言编程讲解...

    C语言基础知识:printf的输出格式 printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为 ...

  6. c语言的main含糊,第1-2章 C语言基础知识

    <第1-2章 C语言基础知识>由会员分享,可在线阅读,更多相关<第1-2章 C语言基础知识(17页珍藏版)>请在人人文库网上搜索. 1.第1-2章C语言基础知识,本章教学内容, ...

  7. python语言中、用来表示赋值的符号是_第二章Python语言基础知识

    第二章Python语言基础知识 2.1 Python语言基础知识 2.1.1标识符与关键字 在Python语言中,对程序中各个元素命名加以区分,这种用来标识变量.函数.类等元素的符号称为标识符. Py ...

  8. 用c语言编译频率求波长,第2章 C语言基础知识.doc

    第二章 C语言基础知识 2.1 常量和变量 [学习目标] 掌握常用标识符的命名规则 掌握常量和变量的定义与引用方法 实例5 常量和变量--输出常量与变量的值 [实例任务] 定义不同类型的几个变量,然后 ...

  9. c++语言基础知识,c++语言基础知识汇总.ppt

    <c++语言基础知识汇总.ppt>由会员分享,可在线阅读,更多相关<c++语言基础知识汇总.ppt(68页珍藏版)>请在人人文库网上搜索. 1.1,第二章 C+语言初步,本章主 ...

最新文章

  1. MongoDB中_class字段的作用
  2. 高斯噪声和椒盐噪声python
  3. 控件setVisible为false会导致控件被移除
  4. android程序root权限,android – 如何从源代码授予对特定应用程序的root访问权限而不是root权限?...
  5. 用php写一个可以抽取随机数的工具一次只抽四个怎么实现?_面试了一个32岁的程序员,场面一度很尴尬。...
  6. Docker精华问答 | Docker vs VM
  7. anaconda管理不同版本Python
  8. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,
  9. extThree20XML extThree20JSON 引入到工程中的方式
  10. Scrapy入门程序点评
  11. 如何用MATLAB编写FIR维纳滤波器,Fir维纳滤波器的Matlab仿真
  12. html无序列表转换为图片,HTML 无序列表项目符号使用图片的CSS写法
  13. python实现12306车票查询
  14. 7-1 计算职工工资c语言,C语言职工工资管理系统
  15. WPS word表格中的神秘的底色
  16. 忍不住推荐一款作图工具draw.io
  17. [ESP8266]刷MQTT固件以及连接服务器失败的问题解决
  18. 【Pytorch with fastai】第 14 章 :ResNet
  19. web项目使用maven打jar包方式
  20. 【数学建模入门】整数规划求最优解|分枝定界法求最优解

热门文章

  1. python私有变量和继承_python中私有变量的继承
  2. 通过支付宝完成阿里云个人账号实名认证的方法 新手必看的教程
  3. iapp开发的在线电影影视APP源码 带php后台
  4. 第四部分 单声道、立体声和环绕声
  5. Java读取txt文件指定行数
  6. C++宽字符类型wchar_t
  7. html用户名框架,html的基本框架和常用标签
  8. 面试题1:一个人岁数的3次方是四位数,四次方是六位数,并知道此人岁数的3次方和4次方用遍了0--9十个数字,请编程写程序求此人的岁数
  9. 输入几句话,然后让系统 随机生成 一些 新的 句子
  10. 渗透测试-任意文件下载漏洞