千家信息网

golang中函数怎么用

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍golang中函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!函数是组织好的,可重复利用的、用于执行指定任务的代码块。go语言中支持函数、匿名函数和闭包
千家信息网最后更新 2024年11月23日golang中函数怎么用

这篇文章主要介绍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指令执行前。具体如下图所示:

func f1() int {    x := 5    defer func() {        x++    }()    return x}func f2() (x int) {    defer func() {        x++    }()    return 5}func f3() (y int) {    x := 5    defer func() {        x++    }()    return x}func f4() (x int) {    defer func(x int) {        x++    }(x)    return 5}func main() {    fmt.Println(f1())    fmt.Println(f2())    fmt.Println(f3())    fmt.Println(f4())}

函数进阶

变量作用域

全局变量

全局变量是定义在函数外的变量,它在程序整个运行周期内都有效。在函数中可以访问到全局变量。

package mainimport (    "fmt")var num int = 10func testGlobal(){    fmt.Printf("num =%d\n", num)}func main(){    testGlobal()}
局部变量

局部变量又分为两种:函数内定义的变量无法再该函数外使用,例如下面的示例代码main函数中无法使用testLocalvar函数中定义的变量x:

package mainimport (    "fmt")func testLocalvar(){    var x int = 100    fmt.Printf("x=%d\n",x)}func main(){    testLocalvar()    fmt.Println(x)}

如果局部变量和全局变量重名,优先访问局部变量:

package mainimport (    "fmt")var num int = 100func testNum(){    num := 100    fmt.Printf("num=%d\n",num)}func main(){    testNum() //num =100}

接下来我们来看一下语句块定义的变量,通常我们会在if条件判断、for循环、switch语句上使用这种定义变量的方式。

package mainimport (    "fmt")func testLocalvar(x,y int){    fmt.Println(x,y)    if x > 0 {        z := 100        fmt.Println(z)    }    fmt.Println(z) //此处无法使用变量i}func main(){    testLocalvar(1,2) //num =100}
函数作为变量

函数可以作为变量进行传递:

func main() {    f1 := add                         //将函数add赋值给变量f1    fmt.Printf("type of f1:%T\n", f1) //type of f1:func(int, int) int    ret := f1(10, 20)    fmt.Println(ret)}
函数可以作为参数

func add(x, y int) int {
return x + y
}
func calc(x, y int, op func(int, int) int) int {
return op(x, y)
}
func main() {
ret2 := calc(10, 20, add)
fmt.Println(ret2) //30
}

匿名函数

函数还可以作为返回值,但是在Go语言中函数内部不能再像之前那样定义函数了,只能定义匿名函数,匿名函数就是没有函数名的函数,匿名函数的定义格式如下:

func(参数)(返回值){    函数体}

匿名函数因为没有函数名,所以没办法像普通函数那样调用,所有匿名函数需要保存到某个变量或者作为立即执行函数:

package mainimport (    "fmt")func main(){    add := func(x,y int){        fmt.Println(x+y)    }    add(10,20)    func(x,y int){        fmt.Println(x+y)    }(10,20)}
闭包

闭包指的是一个函数和与其相关引用环境组合而成的实体。简单的说,闭包=函数+引用环境。首先我们看一个实例:

func adder() func(int) int {    var x int    return func(y int) int {        x += y        return x    }}func main() {    var f = adder()    fmt.Println(f(10)) //10    fmt.Println(f(20)) //30    fmt.Println(f(30)) //60    f1 := adder()    fmt.Println(f1(40)) //40    fmt.Println(f1(50)) //90}

以上是"golang中函数怎么用"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

函数 变量 参数 类型 语言 语句 代码 全局 局部 闭包 可变 两个 关键 多个 关键字 内容 字母 指令 数字 方式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国家网络安全主任 安全网关是不是服务器 办公软件开发笔记本推荐 avast!网络安全软件 局域网找用友服务器名称 坦克世界如何选择服务器 计算机网络技术诞生的基础 网络技术练兵 动态综合网络安全防御体系 数据库建索引的优缺点 武汉百纳巴巴网络技术有限公司 河海大学网络安全考研 百度贴吧的数据库设计 对软件开发 数据库认识 济南名信网络技术有限公司 如何快速导入数据库 国家网络安全应遵循的方针是 福州医院自助终端软件开发 创造与魔法和平服务器选哪个 四川成都浪潮服务器代理商云主机 嘉定区综合软件开发厂家直销 pppoe服务器 路由器 吃鸡怎么看好友在哪个服务器 网络安全 成都理工 wow没有可用的服务器 1.1版本我的世界服务器手机版 华为网络技术工程师课程 飞利信与网络安全有关吗 焦作软件开发招聘 党和国家对网络安全要求
0