Go基础---->go的基础学习(二)
这里记录的是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的基础学习(二)的更多相关文章
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- .net基础学java系列(二)IDE 之 插件
上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...
- 20165312 C语言基础调查和JAVA学习展望
C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...
- 零基础的人怎么学习Java
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- MySQL基础之事务编程学习笔记
MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...
随机推荐
- GNU make学习笔记
第五章:规则的命令 5.1 命令的回显 make在执行命令之前会把要执行的命令输出到标准输出设备,称之为"回显". 如果规则的命令以字符"@"开始,则make在 ...
- mysql 2013错误解决
今天,莫名其妙的来了个mysql 2013错误,导致无法登陆mysql gui工具,而且dos也进不去,提示ping 127.0.0.1,百度+google后: 这是在使用 mysql 的过程中,困扰 ...
- si4438 cca 侦听
/* set GPIO0 for RSSI interrupt / CCA */txbuf[0] = CMD_GPIO_PIN_CFG;txbuf[1] = 27; /* GPIO[0] = 27: ...
- 在Ubuntu中安装PHP,MySQL,Nginx和phpMyAdmin
apt install php apt-get install php7.0 apt-get -y install php7.0-fpm 缺少 mysqli 扩展.请检查 PHP 配置. apt in ...
- 上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么
PHP7 up and running 泊学原文链接泊学实操视频 Uniform Variable Syntax 在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都 ...
- 【转】【C++】C++ 中的线程、锁和条件变量
线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通函数,匿名函数和仿函数(一个实现了operator()函数的类)一同 ...
- SSH远程登录其他机器
常用格式:ssh [-l login_name] [-p port] [user@]hostname更详细的可以用ssh -h查看. 不指定用户: ssh 192.168.0.11 指定用户: ssh ...
- CentOS 6.5 下利用命令行截图及设置快捷键截图
CentOS 6.5 下利用命令行截图及设置快捷键截图 1.利用命令模式 捕获整个屏幕 : $ gnome-screenshot 截完屏之后我们可以设置自定义图片存储位置,如图: 捕获当前终端Term ...
- 【Java面试题】11 什么是内部类?Static Nested Class 和 Inner Class的不同。
Inner Class(内部类)定义在类中的类. (一般是JAVA的说法) Nested Class(嵌套类)是静态(static)内部类.(一般是C++的说法)静态内部类:1 创建一个static内 ...
- 【Java面试题】5 Integer的int 的种种比较?详细分析
如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...