这里记录的是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. PHP程序员的10个有用的技巧和教程

    PHP被定义为一个通用的服务器端脚本语言,它基本上是专为Web开发的重要目的.借助PHP可以创建动态和惊人的网页效果,他是被嵌入在一个HTML源文件的服务器端的脚本语言之一.因此,它成为最流行的,也是 ...

  2. PHP7新特性的介绍

    关于PHP 20年的发展历史: 迄今为止最流行的WEB开发语言: 超过82%的网站都会使用PHP作为他们的服务端开发语言: 新特性介绍 PHP NG – Zend Engine 3 抽象语法树 64位 ...

  3. 专题实验 Storage structure 物理存储

    物理存储结构主要是指: extent的分配, 以及datablock 存储相关, 置于tablespace, segment 都是逻辑结构. tablespace : 逻辑结构, 没有实际物理存储. ...

  4. kbengine + cocos2d-js-demo理解

    KBEngine 是国内开源的游戏服务器引擎,据说参考了 Bigworld 的架构:网上能找到的开源游戏服务器引擎很少,网易的 Pomelo 是用 Node.js 来实现的,现在还是觉得 C/C++ ...

  5. solr学习2

    1:solr中的时间问题 solr中显示的时间默认会比我们本机时间少八个小时,因为时区不一样. 在solr的web页面查看会发现时间少八个小时. 但是使用java代码操作的时候是整成的的,所以在这只需 ...

  6. python中时间操作总结

    一.time 二.datetime 1.获取当前系统时间 datenow = datetime.datetime.now() 2.将datetime格式的时间转换成str datenow = date ...

  7. e685. 显示页面格式窗口

    The page format dialog allows the user to change the default page format values such as the orientat ...

  8. Blend for Visual Studio 2013

    软件开发中为了使设计师和程序员“并行”工作并直接参与到程序的开发中来. 1.在网络程序开发团队中,草图设计后,设计师们可以使用HTML.CSS.JavaScript直接生成UI,程序员则在这个UI产生 ...

  9. php -- 读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  10. ThinkPHP之文件上传

    在项目其中.我们有的时候需要上传图片的功能.简单的从面相过程的方法是相对较为复杂的,要一步一步的来.假设用框架的话,相对就简单了很多,主要就是方法以及每个变量所代表的意义,然后就是一些注意的地方了. ...