这里记录的是go中函数的一些基础知识。道听途说终是浅,身临其境方知深。

go的基础知识

一、go中函数的基础使用

package main 

import (
"fmt"
"errors"
) func add(a int, b int) (ret int, err error) {
if a < 0 || b < 0 {
err = errors.New("Should be non-negative numbers!")
return
}
return a + b, nil
} // 不定参数类型
func myFunc(args ...int) int {
var result int
for _, arg := range args {
result += arg
}
return result
} func main() {
result, err := add(3, 4)
fmt.Println(result, err) // 7 <nil> fmt.Println(add(-1 ,34)) // 0 Should be non-negative numbers! fmt.Println(myFunc(1, 3, 5, 7)) //
}

二、go中的关于匿名函数的使用

package main 

import "fmt"

func main() {
// 匿名函数赋值给一个变量
f := func (x, y int) int {
return x + y
}
fmt.Println(f(3, 45)) // 48 // 匿名函数直接执行
var result = func (x, y int) int {
return x - y
}(45, 6)
fmt.Println(result) //
}

三、go中闭包的使用

Go的匿名函数是一个闭包,闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。

一个比较好的例子可以参考一下:http://blog.csdn.net/u012296101/article/details/48525605

package main

import "fmt"

func adder() func(int) int {
sum := 0
return func (x int) int {
fmt.Println(">>>>>", sum)
sum += x
return sum
}
} func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(pos(i), neg(-2 * i))
}
}

运行的效果如下:

>>>>>
>>>>> >>>>>
>>>>>
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-
>>>>>
>>>>> -
-

四、go中的defer关键字

package main 

import (
"fmt"
) func main() {
defer fmt.Println("before execute")
fmt.Println("my name is LL.")
defer fmt.Println("after execute")
}

运行的结果:

my name is LL.
after execute
before execute

defer函数调用被压入一个栈中。当函数返回时, 会按照后进先出的顺序调用被延迟的函数调用。

五、panic() 和 recover()的函数

package main

import (
"fmt"
) // 最简单的例子
func SimplePanicRecover() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
}()
panic("SimplePanicRecover function panic-ed!")
} // 当 defer 中也调用了 panic 函数时,最后被调用的 panic 函数的参数会被后面的 recover 函数获取到
// 一个函数中可以定义多个 defer 函数,按照 FILO 的规则执行
func MultiPanicRecover() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
}()
defer func() {
panic("MultiPanicRecover defer inner panic")
}()
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
}()
panic("MultiPanicRecover function panic-ed!")
} // recover 函数只有在 defer 函数中被直接调用的时候才可以获取 panic 的参数
func RecoverPlaceTest() {
// 下面一行代码中 recover 函数会返回 nil,但也不影响程序运行
defer recover()
// recover 函数返回 nil
defer fmt.Println("recover() is: ", recover())
defer func() {
func() {
// 由于不是在 defer 调用函数中直接调用 recover 函数,recover 函数会返回 nil
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
}() }()
defer func() {
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
}()
panic("RecoverPlaceTest function panic-ed!")
} // 如果函数没有 panic,调用 recover 函数不会获取到任何信息,也不会影响当前进程。
func NoPanicButHasRecover() {
if err := recover(); err != nil {
fmt.Println("NoPanicButHasRecover Panic info is: ", err)
} else {
fmt.Println("NoPanicButHasRecover Panic info is: ", err)
}
} // 定义一个调用 recover 函数的函数
func CallRecover() {
if err := recover(); err != nil {
fmt.Println("Panic info is: ", err)
}
} // 定义个函数,在其中 defer 另一个调用了 recover 函数的函数
func RecoverInOutterFunc() {
defer CallRecover()
panic("RecoverInOutterFunc function panic-ed!")
} func main() {
SimplePanicRecover()
MultiPanicRecover()
RecoverPlaceTest()
NoPanicButHasRecover()
RecoverInOutterFunc()
}

运行的结果如下:

Panic info is:  SimplePanicRecover function panic-ed!
Panic info is: MultiPanicRecover function panic-ed!
Panic info is: MultiPanicRecover defer inner panic
Panic info is: RecoverPlaceTest function panic-ed!
recover() is: <nil>
NoPanicButHasRecover Panic info is: <nil>
Panic info is: RecoverInOutterFunc function panic-ed!

可以参考博客:http://www.cnblogs.com/ghj1976/archive/2013/02/11/2910114.html

友情链接

Go基础---->go的基础学习(二)的更多相关文章

  1. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  2. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  3. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  4. Go基础学习(二)

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...

  5. 如何夯实(Java)编程基础,并深入学习和提高

    如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...

  6. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

  7. 20165312 C语言基础调查和JAVA学习展望

    C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...

  8. 零基础的人怎么学习Java

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  9. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  10. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

随机推荐

  1. pthread_self()究竟根据什么来得到线程的标识符????

    #include<stdlib.h> #include<pthread.h> #include<stdio.h> #include<sched.h> # ...

  2. Windows下Postgresql数据库的下载与配置方法

    注意下载的是二进制版,不是带Windows Installer的,即绿色版本 http://www.enterprisedb.com/products-services-training/pgbind ...

  3. JAVA里使用CKEditor和CKFinder的配置

    在JSP里使用CKEditor和CKFinder的配置 CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. “预览”中有一大堆鸟语,看 ...

  4. Andriod——数据存储 SharedPrefrences

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  5. 数据结构——算法之(043)(c++各种排序算法实现)

    [申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:Mr_chenping@163.com] 题目: c++ 各种排序算法实现 题目分析: 详细排序原理參考相关算法书籍 算法实现 ...

  6. dubbo 常见错误 通配符的匹配很全面, 但无法找到元素 'dubbo:application' java.lang.reflect.MalformedParameterizedTypeException 通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明。 Unsupported major.minor version 52.0 (unable to l

    dubbo 常见错误 1. Caused by: java.lang.reflect.MalformedParameterizedTypeException 启动时报错,原因是dubbo 依赖 spr ...

  7. axis client error Bad envelope tag: definitions

    http://blog.csdn.net/lifuxiangcaohui/article/details/8090503 ——————————————————————————————————————— ...

  8. 没有启动 ASP.NET State service错误的解决方法

    具体错误如下: 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端 ...

  9. QSignalMapper类处理多信号关联同一个槽的方法(2)

    例1: QSignMapper *mapper = new QSignMapper(this) QPushButton *btn1 = new QPushButton(this); btn1-> ...

  10. CentOS 7 Minimal编译安装MySQL5.6

    写在前面,编译安装MySQL的优势:平台无关.可设定参数按需安装.安装的MySQL目录独立(方便清楚).更好的平台耦合及运行性能(很多运维的观点):缺点:编译安装较慢. 一.撤换系统防火墙 注:Cen ...