golang 碎片整理之 函数

函数是组织好的,可重复利用的、用于执行指定任务的代码块。
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指令执行前。具体如下图所示:

原文地址:https://blog.51cto.com/13766835/2398786

时间: 2024-11-06 09:32:10

golang 碎片整理之 函数的相关文章

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础.结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type).在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样.因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位. 如何定义一个结构体 type Coordinate struct {

golang碎片整理之 fmt.Scan

本文介绍了从golang语言中fmt包从标准输入获取数据的Scan系列函数.从io.Reader中获取数据的Fscan系列函数以及从字符串中获取数据的Sscan系列函数的用法. Scan系列 go语言fmt包下有fmt.Scan.fmt.Scanf.fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入. fmt.Scan 语法 func Scan(a ...interface{}) (n int, err error) Scan 从标准输入扫描文本,读取由空白符分隔的值保存

golang 碎片整理 之 指针

golang中保留了C中的值和指针的区别,但对于指针的繁琐用法进行了简化,引入了"引用"的概念,所以在go语言中,你不用担心因为直接操作内存而引起各式各样的错误.运算符只有 & 和 ,一个是取地址一个是取值(解析地址). func main(){ var i int i = 1 var p *int p = &i fmt.Printf("i=%d,p=%d,*p=%d\n",i,p,*p) *p =2 fmt.Printf("i=%d,p=

golang碎片整理之反射

本文介绍go语言反射的意义和基本使用. 变量的内在机制 go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息 值信息:程序运行过程中可动态变化的. 反射的介绍 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息.支持反射的语言可以在程序编译期将变量的反射信息,如字段名称,类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射

golang 碎片整理之 并发

并发与并行 并发:同一时间段内执行多个任务.并行:同一时刻执行多个任务. Go语言的并发通过goroutine实现.goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作.goroutine是由go语言的运行调度完成的,而线程是由操作系统调度完成的.Go语言还提供了channel在多个goroutine间进行通信.goroutine和channel是go语言秉承的CSP(Communicating Sequential Process)并发模式的

golang 碎片整理之MySQL

MySQL是常用的关系型数据库,本文介绍了go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql 包提供了保证SQL或类SQL数据库的广泛接口,并不提供具体的数据库驱动.使用database/sql包时必须注入一个数据库驱动. 下载依赖 go get -u github.com/go-sql-driver/mysql 使用MySQL驱动 func Open(driverName,dataSourceName string)(*DB,error) Ope

索引碎片整理(转)

索引碎片整理 一碎片种类 1 内部碎片,又称为平均页密度.是指索引正在占有超过它实际所需的空间大小. 它具有两面型:低百分比会对读取数据的查询产生负面影响,会涉及更多读取操作,因为如果页被填充满的话, 只需读取更少的页:另一方面,如果如果在创建索引时设置一个较低的填充因子,就可以避免当插入更多记录而不 必进行页拆分. 对应sys.dm_db_index_physical_stats的列avg_page_space_used_in_percent. 2 外部碎片,又称平均碎片百分比,或逻辑碎片.是

浅谈磁盘碎片整理的好处与方法

磁盘碎片整理的好处 1.磁盘碎片整理可以让系统运行更顺畅,减少卡顿的现象,提高系统性能.2.需要注意的是,使用固态硬盘的用户千万不要使用"磁盘碎片整理"功能,因为所使用的技术不同,使用Windows自带的磁 盘碎片整理会使固态硬盘的寿命大大减短. 磁盘碎片整理的方法步骤 打开"此电脑",选中任意磁盘盘符,然后点击"管理"-"优化" 选中整理的磁盘,可以使用"Ctrl"+ "鼠标左键"来选

磁盘碎片整理程序的原理是什么?

盘碎片整理,就是通过系统软件或者专业的磁盘碎片整理软件对电脑磁盘在长期使用过程中产生的碎片和凌乱文件重新整理,释放出更多的磁盘空间,可提高电脑的整体性能和运行速度. 磁盘碎片应该称为文件碎片,是因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的.硬盘在使用一段时间后,由于反复写入和删除文件,磁盘中的空闲扇区会分散到整个磁盘中不连续的物理位置上,从而使文件不能存在连续的扇区类.这样,再读写文件时就需要到不同的地方去读取,增加了磁头的来回移动,降低了磁盘的访问速度.当应用