golang碎片整理之函数(代码片段)

author author     2022-12-12     128

关键词:

函数是组织好的,可重复利用的、用于执行指定任务的代码块。
go语言中支持函数、匿名函数和闭包,并且函数在go语言中属于“一等公民”。

函数定义

go语言中使用func关键字定义函数,具体格式如下:

func 函数名(参数) (返回值)
    函数体

其中,

  • 函数名由字母、数字、下划线组成,但是函数名的第一个字母不能是数字,在同一个包内,函数名也不能重名。
  • 参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
  • 返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。
  • 函数体:实现指定功能的代码块

我们先来定义一个求两个数之和的函数

func sumint(x int, y int) int 
     return x+y

函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:

func sayHello() 
    fmt.Println("Hello 沙河")

函数的调用

定义了函数后,我们通过 函数名() 的方式来调用函数,例如我们调用上面定义的函数:

func main() 
    sayHello()
    ret := intSum(10, 20)
    fmt.Println(ret)

注意,调用有返回值的函数时,可以不接收其返回值。

参数

类型简写

函数的参数中,如果相邻变量的类型相同,可以省略类型,如下:

func intSum(x, y int) int 
    return x + y

上面的代码,函数有两个参数,这两个参数的类型均为int,因此可以省略x的类型,因为y后面有类型说明,x参数也是该类型。

可变参数

可变参数是指函数的参数数量不固定,Go语言中的可变参数,通过在参数名后面加...来标识。
注意:可变参数通常作为函数的最后一个参数。
举个例子:

func intSum2(x ...int) int 
    fmt.Println(x) //x是一个切片
    sum := 0
    for _, v := range x 
        sum = sum + v
    
    return sum

返回值

go语言中通过return关键字向外输出函数的返回值。

多返回值

go语言中的函数支持多个返回值,并在函数体中直接使用这些变量,最后通过return 关键词返回。

func calc(x, y int) (sum, sub int) 
    sum = x + y
    sub = x - y
    return

defer语句

由于go语句中的延迟调研的特性,所以defer语句能非常方便的处理资源释放问题,比如:资源清理、文件关闭、解锁及记录时间等。

defer 的执行时机和案例分析

在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前。具体如下图所示:
技术图片

golang碎片整理之指针(代码片段)

golang中保留了C中的值和指针的区别,但对于指针的繁琐用法进行了简化,引入了"引用"的概念,所以在go语言中,你不用担心因为直接操作内存而引起各式各样的错误。运算符只有&和,一个是取地址一个是取值(解析... 查看详情

golang碎片整理之结构体(代码片段)

...集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。结构体的概念在软件工程上的旧术语是ADT(抽象数据类型:AbstractDatetype)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一... 查看详情

go语言碎片整理之strconv(代码片段)

strconv包strconv包实现额基本数据类型与其字符串表示的转换,主要有以下常用函数,Atoi()、Itia()、parse系列、format系列、append系列。string与int类型转换这一组函数是我们平时用的最多的。Atoi()Atio()函数用于将字符串类型的整数转... 查看详情

go语言碎片整理之文件操作(代码片段)

文件是什么?计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。打开和关闭文件os.Open()函数能够打开一个文件,返回一个*File和一个error。对得到的文件实例调用close()方法能够关... 查看详情

go语言碎片整理之标准库log(代码片段)

无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直是很重要的环节,我们也应该养成在程序中记录日志的好习惯。logGo语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。使用Loggerlog包定... 查看详情

go语言碎片整理之time(代码片段)

时间和日期是我们编程中经常用到的,本文主要介绍了Go语言内置的time包的基本用法。Go语言中导入包单行导入import"time"import"fmt"多行导入import("fmt""time")time包time.Time类型表示时间。funcmain()now:=time.Now()fmt.Printf("currenttimeis:%v\n",now)ye... 查看详情

golang之匿名函数和闭包(代码片段)

Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。使用方法如下:main.gopackagemainimport("fmt")funcmain()varvfunc(aint)intv=func(aint)intreturna*afmt.Println(v(6))//两种写法v1:=func(iint)intreturni*ifmt.Println(v1(7))GO语言的匿名函 查看详情

vulkan系列教程—vma教程—defragmentation(碎片整理)(代码片段)

文章目录前言碎片整理一、DefragmentingCPUmemory(CPU内存碎片整理)二、DefragmentingGPUmemory(GPU内存碎片整理)三、额外注意点四、编写用户自定义内存碎片整理算法前言本文为Vulkan®MemoryAllocator系列系列教程,定... 查看详情

vulkan系列教程—vma教程—defragmentation(碎片整理)(代码片段)

文章目录前言碎片整理一、DefragmentingCPUmemory(CPU内存碎片整理)二、DefragmentingGPUmemory(GPU内存碎片整理)三、额外注意点四、编写用户自定义内存碎片整理算法前言本文为Vulkan®MemoryAllocator系列系列教程,定... 查看详情

golang基础之三-字符串,时间,流程控制,函数(代码片段)

strings和strconv的使用stringsstrings.HasPrefix(sstring,preffixstring)bool:判断字符串s是否以prefix开头stirngs.HasSuffix(sstring,suffixstring)bool:判断字符串s是否以suffix结尾strings.Index(sstring,strstring)int:判断str在s中首次出现的位置, 查看详情

go语言碎片整理之标准库log

  log  Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。  使用Logger  log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过... 查看详情

golang之结构体(代码片段)

构造函数Go语言的结构体没有构造函数,我们可以自己实现。例如,下方的代码就实现了一个person的构造函数。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型... 查看详情

sql利用存储过程进行选择性的进行碎片整理(代码片段)

查看详情

sql利用存储过程进行选择性的进行碎片整理(代码片段)

查看详情

golang设计模式之选项模式(代码片段)

...参数即可,类似于python里面的默认参数和字典参数,虽然golang里面既没有默认参数也没有字典参数,但是我们有选项模式可变长参数列表在这之前,首先需要介绍一下可变长参数列表,顾名思义,就是参数的个数不固定,可以是... 查看详情

golang之文件(代码片段)

好久之前学得了,用到时发现全忘了,记录一下打开文件+关闭文件os.Openos.Open()函数能够打开一个文件,返回一个*File和一个err,*File为即文件对象(文件指针、文件句柄),file是在os包中的,封装了底层的文件描述符和相关信息... 查看详情

teradata的磁盘碎片整理(代码片段)

1.使用vncciewer登陆SWS并登录节点并查看数据库状态登陆SMP001-8节点21.*.*.*#pshpdestate-a#pshsar15检查数据库状态是否为:tpaisrunning/started,检查系统繁忙程度正常2.运行ferret#cnsterm6>startferretctrl+c退出3.开始packdisk开始packdisk#cnsterm1>packd... 查看详情

es6知识点整理之----generator----其他(代码片段)

1、如果一个对象的属性是Generator函数,可以简写成下面的形式。letobj=*myGeneratorMethod()···;2、Generator函数总是返回一个遍历器,这个遍历器是Generator函数的实例,也继承了Generator函数的prototype对象上的方法。3、Generator函数不能... 查看详情