前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Golang语言情怀-第7期 Go 语言函数

Golang语言情怀-第7期 Go 语言函数

作者头像
李海彬
发布2021-01-12 10:22:39
发布2021-01-12 10:22:39
34900
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行

本期给大家梳理下Go语言函数, 如下

函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型,和参数。Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

函数定义

Go 语言函数定义格式如下:

代码语言:javascript
代码运行次数:0
复制
func function_name( [parameter list] ) [return_types] {
   函数体
}

函数定义解析:

func:函数由 func 开始声明

function_name:函数名称,函数名和参数列表一起构成了函数签名。

parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。

return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。

函数体:函数定义的代码集合。

函数参数

函数如果使用参数,该变量可称为函数的形参。

形参就像定义在函数体内的局部变量。

调用函数,可以通过两种方式来传递参数:

传递类型

描述

值传递

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递

引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

函数多返回值

代码语言:javascript
代码运行次数:0
复制
// 获取房间状态
func GetRoomState(roomType int) (int,interface{}) {
    rcdata :=GRoom[roomType].Data
    return rcdata.GameState,rcdata.Data
}

函数用法

函数用法

描述

函数作为另外一个函数的实参

函数定义后可作为另外一个函数的实参数传入

闭包

闭包是匿名函数,可在动态编程中使用

方法

认识闭包

首先来看一段代码:

代码语言:javascript
代码运行次数:0
复制
package main

import (
    "fmt"
)

func squares() func() int {
    var x int
    return func() int {
        x++
        return x * x
    }
}

func main() {
    f1 := squares()
    f2 := squares()

    fmt.Println("first call f1:", f1())
    fmt.Println("second call f1:", f1())
    fmt.Println("first call f2:", f2())
    fmt.Println("second call f2:", f2())
}

调试结果是这样的:

代码很简单,就是定义一个square函数,返回值类型是func() int,返回的这个函数就是一个闭包。

那么什么是闭包呢? 闭包是函数和它所引用的环境,也就是闭包=函数+引用环境。

匿名函数虽然没有定义x,但是它引用了他所在的环境(函数squares)中的变量x。f1跟f2引用的是不同的环境,在调用x++时修改的不是同一个x,因此两个函数的第一次输出都是1。函数squares每进入一次,就形成了一个新的环境,对应的闭包中,函数都是同一个函数,环境却是引用不同的环境。

我们在看一下上面的例子,发现变量x的生命周期不是由他的作用域所决定的,变量x在main函数中返回squares函数后依旧存在。变量x是函数squares中的局部变量,假设这个变量是在函数squares的栈中分配的,是不可以的。因为函数squares返回以后,对应的栈就失效了,squares返回的那个函数中变量i就引用一个失效的位置了。所以闭包的环境中引用的变量不能够在栈上分配。(出自:https://www.cnblogs.com/ralap7/p/9195677.html)

Golang语言情怀

ID:wwwGolangLtd

www.Golang.Ltd

游戏服务器架构丨分布式技术丨大数据丨Go语言学习

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言情怀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数定义
  • 函数参数
  • 函数多返回值
  • 函数用法
  • 认识闭包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档