Go函数

函数不但可以用于封装数据、分割功能、解耦逻辑,还可以化身为普通的值,在其他函数间传递、赋予变量、做类型判断和转换等。

函数值可以成为被随意传播的独立逻辑组件(功能模块)。

函数定义

函数的基本组成为:关键字func、函数名、参数列表、返回值列表、函数体、返回语句

func function_name( [parameter list] ) [return_types] {
   函数体
}

func Add(a,b int) (res int, err error){
    if a < 0 || b < 0 {
        err = errors.New("数值不能小于0")
        return
    }
    res = a+b
    return
}

不管传递的是指针、引用还是其它类型参数,都是值拷贝传递的,区别在于拷贝的目标是目标对象还是拷贝指针而已。

在函数调用之前,编译器会为形参和返回值分配内存空间,并将实参拷贝到形参内存。

函数的签名

参数

参数列表中,若相邻变量类型一致可以合写。
如下面例子,二者等价

func Add(a int, b int) int {}
func Add(a,b int) int {}

不定参数

不定参数是指函数传入的参数个数为不定数量。且必须是最后一个参数。

args ...type的形式来表示不定参数,它是一个语法糖,即这种语法对语言的功能没有影响,但方便程序员使用。

下例展示了类型为int的不定参数的使用

func myfunc(args ...int) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}
//myfunc(1,2,5,7) 调用
//myfunc(3,4,7,2,4,6) 调用

如果想传递任意类型的参数,可以使用 args ...interface{}
如Go语言标准库中fmt.Printf()的函数原型

func Printf(format string, args ...interface{}) {}

返回值

返回值列表中,如果只有一个返回值,返回值类型可以不加括号,如

func Add(a,b int) int {}

多返回值

Go语言的函数或者成员方法可以有多个返回值!其他语言只能有一个返回值

返回值列表中,如果有多个返回值,return语句必须符合返回值列表类型的顺序

func Add(a,b int, c string) (int, string) {
    x := a+b //int类型
    y := c//string类型
    return x,y //x y的顺序要对,反过来就会报错
}

返回值列表中,除了写返回值的类型外,也可以直接指明返回值名称,这样就不用在函数体里声明返回值的名称了(直接用返回值列表中声明的名称),而且return句也可以省略return的内容(自动匹配返回值列表中的内容)。这时,即使只有一个返回值也要加括号

func Add(a,b int) (res int, err error) {
    res = a+b //不用先声明res了,返回值列表中声明过了
    return //等价于return res,err
}

上面写法也可以用下面的替代

func Add(a,b int) (res int, err error) {
    return a+b,err
}

跳过返回值

如果调用了一个多返回值的函数或方法,但不想关心其中的某个返回值,可以用一个下划线_来跳过该返回值。
如调用者在读文件时不想关心Read()函数返回的错误码

n, _ := f.Read(buf)

函数的调用

函数调用很简单,只要在函数名后加小括号即可。

Add(1,2)

匿名函数只要在函数后面加小括号即可自调用

func (a,b int) int {
    return a+b
}(1,2)

匿名函数与闭包

匿名函数

匿名函数顾名思义,就是没有函数名的函数。

func (a,b int) int {
    return a+b
}

匿名函数可以直接赋值给一个变量

f := func (a,b int) int {
    return a+b
}

或者自调用

func (a,b int) int {
    return a+b
}(1,2)

闭包

引用了自由变量的匿名函数就是一个闭包函数。
闭包体现的是由不确定到确定的一个过程。它的内部逻辑并不是完整的,由一部分逻辑需要这个自由变量参与完成。

闭包函数的意义:由于自由变量只由当被调用的时候才确定,所以,闭包函数的部分逻辑是动态生成的,可以借此才程序运行的过程中,根据需要生成功能不同的函数,继而影响后续程序的行为。

高阶函数

内置函数

go 内置函数

GO语言内置函数(有图)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容