Golang 学习笔记(02)—— 函数

本文为转载,原文:Golang 学习笔记(02)—— 函数

Golang

函数定义

函数 是每一门开发语言的最基础的部件,下面看下go语言中的函数是怎么定义的:

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

func是定义函数的关键字,Add是函数名称,int是返回值,小括号内是函数的参数。可以随意安排函数定义的顺序,go在编译时会扫描所以的文件。

多返回值

go中函数支持多返回值,可以返回任意数量的返回值。多值返回在Go语言中是经常被用到的,比如,一个函数同时返回结果和异常。
下面我们看一个例子,divide函数是计算a/b的结果,返回商和余数。

package main
import "fmt"

func main(){
    quotient, remainder := divide(5, 3)
    fmt.Println("商为:", quotient, "余数为:", remainder)
}

func divide(a, b int)(int, int){
    quotient := a / b
    remainder := a % b
    return quotient, remainder
}

变参函数

go中的函数支持变参,变参就是说函数可以有任意数量的参数。变参本质上就是一个slice,且必须是最后一个参数。将slice传递给变参函数时,注意用...展开,否则就当做单个参数处理了。
请看以下例子:

package main
import "fmt"

func main(){
    result := sum(3,5,7,9)
    fmt.Println("结果为:", result)
}

func sum(aregs ...int) int {
    s := 0
    for _, number := range aregs{
        s += number
    }
    return s
}


至于什么是slicerange又是什么鬼,在后面讲到数组的数组的时候详细介绍,slice就相当于数组,range类似一个循环,循环每个字元素的key, value。另外其中的_表示不接受改返回值。

defer

defer是go语言所特有的,defer的作用是延迟执行,在函数返回前,按照栈的形式后进先出的原则一次执行每个defer注册的函数。这样可以保证函数在返回前被调用,通常用来进行资源释放,错误的处理,清理数据等。下面是一个读文件的例子。

package main
import "fmt"
import "os"
func main(){
    str, err := readFile("main.go")
    if err != nil{
        fmt.Println(err.Error())
        return
    }
    fmt.Println(str)
}
func readFile(strFileName string)(string, error){
    f, err := os.Open(strFileName)
    if err != nil{
        fmt.Println("文件读取失败")
        return "", err
    }
    defer f.Close()
    buf := make([]byte, 1024)
    var strContent string = ""
    for{
        n, _ := f.Read(buf)
        if n == 0{
            break
        }
        strContent += string(buf[0:n])
    }
    return strContent, nil
}

函数类型

函数也是一种类型,拥有相同的参数,相同的返回值的函数,是同一种类型。用type来定义函数类型。下面例子中display函数输出大于5的数值。

package main
import "fmt"

type MyFuncType func(int) bool

func isBigThan5(n int)bool{
    return n > 5
}

func display(arr []int, f MyFuncType){
    for _, v := range arr{
        if f(v){
            fmt.Println(v)
        }
    }
}
func main(){
    arr := []int{1,2,3,4,5,6,7,8,9}
    display(arr, isBigThan5)
}


在上面的例子中,type MyFuncType func(int) bool定义了一个函数类型,将其命名为MyFuncType,接受一个int类型的参数,并返回一个bool类型的结果。isBigThan5MyFuncType类型的函数,函数类型。跟C里的函数指针有点像,他是可以把函数当做参数传入到另一个函数里,也有点像委托。

错误处理

go语言中没有try...catch...finally...这种结构化异常处理,而是用panic代替throw跑出异常。使用recover函数来捕获异常。Recover仅在defer函数中使用才能捕获到异常,此时函数的执行流程已经中断,无法恢复到后续位置继续执行。

package main
import "fmt"

func main(){
    test()
}
func test(){
    defer func (){
        if err := recover(); err != nil{
            fmt.Println(err)
        }
    }()
    divide(5,0)
    fmt.Println("end of test")
}

func divide(a, b int) int{
    return a / b
}

本文为原创,转载请注明出处

目录
上一节:Golang 学习笔记(1)—— 基础
下一节:Golang 学习笔记(3)—— 字符串操作

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

推荐阅读更多精彩内容