Golang函数

2023-10-26

一.函数

    1.为完成某一功能的程序指令的集合,称为函数。在Go中,函数分为:自定义函数和系统函数

    2.基本语法:

       func 函数名 (形参列表)(返回值类型列表){

                  执行语句......

                  return 返回值列表

                        }

           (1)形参列表:表示函数的输入

           (2)函数中的语句:表示为了实现某一功能代码块

           (3)函数可以有返回值,也可以没有

案例:

        

二.包

     1.包的本质实际上就是创建不同的文件夹,来存放程序文件

       基本概念:go的每一个文件都属于一个包的,也就是说go是以包的形式来管理文件和项目目录                         结构的。

      原理图:

        

  2.作用:(1)区分相同名字的函数、变量标识符等

                (2)当程序文件很多时,可以很好管理项目

                (3)控制函数、变量等访问范围,即作用域

  3.相关说明:(1)打包基本语法

                            package 包的名字

                    (2)引入包的基本语法

                             import  " 路径 "

案例:

 细节说明:(1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是                       utils,文件的包名通常和文件所在的文件夹名一致,一般为小写字母。

                (2)当一个文件要使用其它包函数或变量时,需要先引入对应的包 import  "包名"

                (3)package指令在文件第一行,然后是import指令

                (4)在import包时,路径从$PATH的src下开始,不用带src,编译器会自动从src下开始引入

                (5)为了让其他包的文件,可以访问到本包的函数,则该函数名的首字母大写,类似其它语                 言的public,这样才能垮包访问。比如utils.go   

                (6)在访问其他包函数时,语法是:包名.函数名 

              

                 (7)如果包名较长,Go支持给包取别名,但取别名后原来的包就不能,例如:原来调用方式为utils.Cal,取别名为utul后,调用方式为util.Cal

                

               (8)同一个包里面不能有相同的函数(也不能有相同的全局变量名)

               (9)如果你要编译成一个可执行程序文件,就需要将这个包声明为main,即package main,这个是语法规范,如果你写的只是一个库,包名可以自定义

三.函数-调用机制

  函数-调用过程图:

    说明(1):在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的           空间和其他栈的空间区分开来

           (2)在每个函数对应的栈中,数据空间是空间的,不会混淆

           (3)当一个函数调用完毕或者使用完毕后,程序会销毁这个数对应的栈空间

 return语句

 GO函数支持返回多个值,这一点是其它编程语言没有的

       func 函数名(形参列表) (返回值类型列表){

          语句

          return返回值列表

           }

说明(1)如果返回多个值时,在接收时,希望忽略某个返回值,则使用_符号表示站位忽略

       (2)如果返回值只有一个,(返回值类型列表) 可以不写()

 

 三.函数-递归调用

      一个函数在函数体内又调用了函数本身,我们称为递归调用

  

 

 函数递归需要遵守的重要原则:

    (1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)

    (2)函数的局部变量是独立的,不会相互影响

    (3)递归必须向退出递归的条件逼近,否则就是无限递归

    (4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。同时当      函数执行完毕或者返回时,该函数本身也会被系统销毁。

案例:1.用递归方式求斐波那契数。

            

        2.求函数值,已知f(1)=3;f(n)=2*f(n-1)+1,用递归方式求出f(n)的值:

            

      3.猴子吃桃问题,有一堆桃子,猴子每天吃其中的一半并多吃一个,第十天时就剩一个了。

             

 函数的注意事项:

     1.函数的形参列表可以是多个,返回值列表也可是多个.

     2.形参列表和返回值列表的数据类型可以是值类型和引用类型.

     3.函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其他包文件使用,类似public,首字母小写,只能被本包文件使用,其他包文件不能使用,类似private。

     4.函数中的变量是局部的,函数外不生效

     5.基本数据类型和数组默认是值传递的,即进行值拷贝。在函数类修改,不会影响到原来的值。

     6.如果希望函数类的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量

    7.Go函数不支持重载    //会报错,会报函数重复定义

    8.在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了,通过该变量可以对函数调用。

                            

    9.函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用

                  

   10.为了简化数据类型定义,Go支持自定义数据类型

        基本语法:type 自定义数据类型名 数据类型   // 相当于一个别名

        案例:type mylnt int //这时mytln就等价 int 来使用了

        案例:type mySum func (int,int) int //这时mySum就等价一个函数类型func(int,int) int

        //在Go中 myint和int虽然都是int类型,但是go认为这两者是两个类型,不一样,赋值的时候会 报错,要转换

                               

   11.支持对函数返回值命名

        

       

  12.使用_标识符,忽略返回值

       

    13.Go支持可变参数

        

      说明:

      (1)args是slice,通过args[index] 可以访问到各个值.

      (2)案例演示:编写一个函数sum,可以求出1到多个int的和

      (3)如果一个函数的形参列表中有可变参数,则可变参数需要放在形参列表最后

           

案例:编写一个函数swap(n1 *int,n2 *int)可以交换n1和n2 的值

        

       

四.init函数

    每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用,通常可以在init函数中完成初始化工作。

    注意:(1)如果一个文件同时包含全局变量定义,init函数和main函数,则执行的流程是变量定义->init函数->main函数

            (2)init函数最主要的作用,就是完成一些初始化的工作,比如下面的案例:

 

五.匿名函数

  1.Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也       可以实现多次调用

  2.匿名函数使用方法:

     (1)在定义匿名函数时就直接调用,这种方式匿名函数就只能调用一次

                       

     (2)将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数

                      

   3.全局匿名函数:

          如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可以在        程序有效

                     

六.闭包

    1.闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)

               

 对上面代码的说明和总结

     (1)AddUpper 是一个函数,返回的数据类型是fun (int)  int

     (2)闭包的说明

                      

            返回的是一个匿名函数,但这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。

     (3)闭包是类,函数是操作,n是字段

     (4)当我们反复的调用f函数时,因为n是初始化一次,因此每调用一次就进行累加.

 2.闭包实践:

    编写一个程序,具体要求如下

    (1)编写一个函数makeSuffix(suffix string)可以接收一个文件后缀名(比如.jpg),并返回一个闭包

    (2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg),则返回 文件名.jpg,如果已经有.jpg后缀,则返回原文件名

    (3)要求使用闭包的方式完成

    (4)string.HasSuffix

             

代码说明:

 1.返回的匿名函数和 makeSuffix(suffix string)的suffix变量组合成一个闭包,因为返回的函数引用到suffix这个变量

七.函数中-defer

     在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer(延时机制)

        

    defer的细节说明:

    (1)当go执行到一个defer时,不会立即执行defer后的语句,而是将defer后的语句压入到一个栈            中,然后继续执行函数下一个语句

    (2)当函数执行完毕后,在从defer栈中,依次从栈顶取出语句执行

    (3)在defer将语句放入到栈时,也会将相关的值拷贝同时入栈

八.函数参数的传递方式

    1.值传递和引用传递

        ps:不管是值传递还是引用传递,传递给函数大的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递还是地址的拷贝,一般来说地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低

    2.值类型和引用类型

      1.值类型:基本数据类型int系列,float系列,bool,string、数组和结构体struct

      2.引用类型:指针、slice切片、map、管道chan、interface等都是引用类型

九.变量作用域

    1.函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部

    2.函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效

   3.如果变量是在一个代码块,比如for/if中,那么这个变量的作用域就在该代码块

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang函数 的相关文章

  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os
  • 匿名结构和空结构

    http play golang org p vhaKi5uVmm http play golang org p vhaKi5uVmm package main import fmt var battle make chan string
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 为什么 gmail API 以纯文本形式发送 html 电子邮件?

    我正在尝试使用 gmail API 发送 html 电子邮件 但由于某些原因 它会随机以纯文本 文本形式发送电子邮件 谷歌似乎改变了我设置的内容类型标头 这有什么理由吗 电子邮件内容始终完全相同 正如我测试的那样 API 仍处于实验阶段吗
  • golang中通道缓冲容量0和1的区别

    我已将通道缓冲区大小设置为零 例如var intChannelZero make chan int 当从intChannelZero将被阻止 直到intChannelZero有价值 另外 我将通道缓冲区大小设置为 1 例如var intCh
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 使用 mgo 驱动程序进行 mongo 聚合查询

    我在 mongodb 中有以下查询 db devices aggregate match userId v73TuQqZykbxFXsWo state true project userId 1 categorySlug 1 weight
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui

随机推荐

  • MATLAB随机生成m个三维坐标点,且各个坐标点之间的距离不小于n

    randi函数 randi max m n 生成均匀分布的随机整数 max生成的随机整数最大值 生成m行n列的矩阵 编写函数sampling function x y z sampling lowx upx lowy upy lowz up
  • 第五篇:进阶篇 发动机的噪声特性

    本专栏分享传统NVH知识点 从声学理论 材料声学 汽车噪声振动分析 车辆及其零部件甚至原材料的声学测试方法等多维度介绍汽车NVH 一些专用术语同时给出了中英文对照 欢迎新人 同行 爱好者一起交流 由于内容写的较为仓促 有误的地方欢迎大家批评
  • JS优化方法(使用最新的js方法)

    1 带有多个条件的if语句 将多个值放在一个数组中 然后调用数组的includes方法 longhand 直接的 if x abc x def x ghi x jkl logic 逻辑 shorthand 速记 if abc def ghi
  • 【FFmpeg】 音视频解码详细流程

    目录 一 视频解码流程 二 FFMPEG解码流程 三 FFmpeg解码函数 四 FFmpeg解码的数据结构 五 FFmpeg数据结构简介 六 FFmpeg数据结构分析 七 像素数据转换 八 FFMPEG解码 九 FFMPEG解码 视频播放
  • Donation-树形dp-建图

    题目网址 链接 int head maxn int n m cnt tot ll a maxn b maxn c maxn id maxn int fa maxn int lson maxn rson maxn struct node in
  • 用单片机C语言精确延时(定时)的方法

    用单片机C语言精确延时 定时 的方法 作者 51hei 来源 原创 点击数 更新时间 2009年09月29日 字体 大 中 小 最近在忙着单片机的项目 偶尔停下来小结了一下最近的收获 还是有不少可贵的收益的 本人在闲暇的时候对单片机C语言下
  • 显示本地openssl支持的加密算法

    在命令行中输入命令 openssl list ciper algorithms 运行后即刻显示支持的加密算法 END
  • [2022CISCN]初赛 复现

    ez usb 刚开始直接提取usb键盘流量 发现导出有问题 键盘流量 搜索8个字节长度的数据包 这里也能发现版本有2 8 1和2 10 1两种 因此猜测需要分别导出 tshark r ez usb pcapng Y usb data len
  • 16. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据

    adc 使用教程2 dma 连续扫描方式采集数据 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 注意 dma使用时存在一个外设映射到一个dam外设
  • css动画改变高度有过渡效果,css3-形变、过渡、动画

    一 2D形变 平移 transform translate x y 相对当前位置 向左移动x像素 像下移动y像素 transform translateX num 相对当前位置 向左移动num像素 transform translateY
  • OpenGLES从2.0到3.0的变化

    1 在着色器文件中添加 version 300 es 表明使用3 0版本 如果不添加则使用默认2 0版本 注意使用opengles3 0的API的时候必须添加 version 300 es 2 GLES 3 0中将GLES 2 0的 att
  • 两个栈来实现一个队列的C++代码

    利用两个栈来实现一个队列 这个问题很常见 最关键的是要有好的思路 至于实现 那是很简单的事情了 在本文中 也想说说自己的思路 但是 我觉得用代码来表述思路更符合我的习惯 也是我的菜 所以 仅仅给出代码 如有需要 大家可以根据代码来理解思路
  • Oracle 11g R2静默安装

    2015年1月6日 测试安装Oracle 11g R2静默安装安装 环境是vmware平台虚拟机 做个记录 CentOS 6 5 x64安装Oracle 11g R2 一 下载地址 http www oracle com technetwo
  • Java实现将数字转换成中文大写

    程序功能 支持将仟亿数字转换成中文数字表示 如 110 12 转换成壹佰壹拾元壹角贰分 算法思路 将数字 分成整数部分和小数部分 小数部分四舍五入到两位 分别进行转换 然后将转换后的结果合并后 生成最终结果 转换过程关键怎么处理中间的零 以
  • 索引2

    索引和全文索引 索引的目的是提高性能 索引提供了一种基于一列或多列的值对表的数据行进行快速访问的方法 索引提供的是表为数据 的逻辑顺序 规划合理的索引能够减少访问所需的时间 从而大大提高数据库的性能 索引 索引为性能带来的好处却是有代价的
  • R手册(Parallel Computing)--foreach

    R手册 Parallel Computing foreach foreach foreach 后端支持 library doParallel 为foreah包提供一个并行的后端 n cores lt detectCores logical
  • 树莓派4B与Android之缘——Android应用MiniChat聊天软件

    基本介绍和总体架构 一 应用介绍 一 基本介绍 MiniChat是一款聊天软件 你可以通过此软件进行聊天 本应用集成了融云模块 从而实现集成通讯 主要功能是账号注册 登录 好友添加 好友间发送文字 文件信息 二 应用展示 1 登录界面 未输
  • Java 终止嵌套for 循环总结

    public class NestedLoopDemo public static void main String args 第一步 构建嵌套for 循环 for int i 0 i lt 10 i for int j 0 j lt 10
  • 手把手教你用Python进行回归(附代码、学习资料)

    作者 GURCHETAN SINGH 翻译 张逸 校对 丁楠雅 本文共5800字 建议阅读8分钟 本文从线性回归 多项式回归出发 带你用Python实现样条回归 我刚开始学习数据科学时 第一个接触到的算法就是线性回归 在把这个方法算法应用在
  • Golang函数

    一 函数 1 为完成某一功能的程序指令的集合 称为函数 在Go中 函数分为 自定义函数和系统函数 2 基本语法 func 函数名 形参列表 返回值类型列表 执行语句 return 返回值列表 1 形参列表 表示函数的输入 2 函数中的语句