golang函数特点:
a.不支持重载,一个包不能有两个名字一样的函数
b.函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
c.匿名函数
d.多返回值
 
例子1
func add(a, b int) int {
return a + b
} func test1() {
fmt.Printf("aaaa")
//函数返回值赋值
c := add
fmt.Printf("%p %T %p %T\n", c, add, c, add) sum := c(, )
fmt.Println(sum) sum = add(, )
fmt.Println(sum)
}
 
 
函数参数传递方式:
1、值传递
2、引用传递
注意:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,性能越低。
注意2:map,slice,chan,指针,interface默认以引用的方式传递
 
例子1

  //自定义类型
  type add_func func(int, int) int
//自定义函数传递
func operator(op add_func, a int, b int) int {
//使用传进来的函数,进行操作
return op(a, b)
} func test2() {
c := add
fmt.Println(c)
sum := operator(c, , )
fmt.Println(sum)
}

命名返回值的名字:
func add(a,b int)(c int){
    c = a+b
    return
}
func calc(a,b int)(sum int,avg int){
    sum = a+b
    avg = (a+b)/2
    return
}
这里的返回值都不用谢,已经在函数体中默认定义返回了

_标识符,用来忽略返回值:
func calc(a,b int)(sum int,avg int){
    sum = a+b
    avg = (a+b)/2
    return
}
func main(){
    sum,_:= calc(100,200)
}
可变参数表现形式:
func add(arg...int)int{
}
func add(a int,arg...int)int{
}
func add(a int,b int,arg...int)int{
}
注意:其中arg是一个slice(切片),我们可以通过arg[index]依次访问
defer用途:
1.当函数返回时,执行defer语句。因此,可以用来做资源清理
2.多个defer语句,按先进后厨的方式执行
3.defer语句中的变量,在defer声明时就决定了
 
应用场景:

(1)关闭文件句柄
func read(){
    file := open(filename)
    defer file.Close()
}
(2)锁资源释放
func read(){
    mc.Lock()
    defer mc.Unlock()
}
(3)数据看连接释放
递归函数
递归函数的设计原则
1)一个大的问题能够分解成相似的小问题
2)定义好出口条件

例子

//例子四,递归求阶乘
func calc(n int) int {
if n == {
return
}
return calc(n-) * n
} func fab(n int) int {
//斐波那契数列
if n <= {
return
}
return fab(n-) + fab(n-)
}
闭包
1、闭包:一个函数与其相关的引用环境组合而成的实体
 
//闭包的例子
//例子1
func Adder() func(int) int {
var x int
//匿名函数
f := func(i int) int {
x = x + i
return x
}
return f
} func testClosure() {
f1 := Adder()
fmt.Println(f1())
fmt.Println(f1())
fmt.Println(f1())
}
//例子2
func makeSuffixFunc(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
} func testClosure2() {
func1 := makeSuffixFunc(".bmp")
func2 := makeSuffixFunc(".jpg")
fmt.Println(func1("test"))
fmt.Println(func2("test"))
}

闭包比较难理解,留个例子后面自己回头再理解一下

golang函数学习笔记的更多相关文章

  1. Golang 语法学习笔记

    Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...

  2. C++学习基础十六-- 函数学习笔记

    C++ Primer 第七章-函数学习笔记 一步一个脚印.循序渐进的学习. 一.参数传递 每次调用函数时,都会重新创建函数所有的形参,此时所传递的实参将会初始化对应的形参. 「如果形参是非引用类型,则 ...

  3. contiki-main.c 中的process系列函数学习笔记 <contiki学习笔记之六>

    说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ---------------------------------------------- ...

  4. Swift2.0 函数学习笔记

    最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用 ...

  5. MYSQL存储过程和函数学习笔记

    学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和 ...

  6. loss函数学习笔记

    一直对机器学习里的loss函数不太懂,这里做点笔记. 符号表示的含义,主要根据Andrew Ng的课程来的,\(m\)个样本,第\(i\)个样本为\(\vec x^{(i)}\),对应ground t ...

  7. jQuery 取消事件冒泡 阻止后续内容执行 闭包函数 (学习笔记)

    1.取消事件冒泡 <title>取消事件冒泡</title> <style> div { border:solid 1px black; } </style& ...

  8. Generator 函数学习笔记

    // 使用 function* 定义一个 generator 函数 function* helloWorldGenerator() { yield 'hello'; // yield 关键字作为暂停的 ...

  9. async 函数学习笔记

    async函数就是Generator函数的语法糖. var fs = require('fs'); var readFile = function (fileName) { return new Pr ...

随机推荐

  1. ASP.NET基础(一)

    ExecuteNonQuery()的用法 下面我们将详细讲解如何在Page_Load()中对数据库的增加.删除.修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar ...

  2. android bitmap compress

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片. 有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量 ...

  3. PDF文件的加载及展示

    项目需要显示PDF文件,于是遍寻了网络,发现的方法以下几种: 1.使用UIWebView加载,没啥说的,根据文件路径,网络或者本地皆可,创建一个NSURLRequest,然后用webView加载就可以 ...

  4. C基础之移位操作

    因为左移操作不会导致符号位出现缺位,所以不考虑符号位,低位补0即可:右移操作会涉及到符号位出现缺位的问题,所以在有符号数的右移操作时要考虑符号位怎么补的问题. 左移操作(<<)对于无符号数 ...

  5. 如何测试是否安装了web服务器

    windows默认没有安装web服务器,我们可以安装IIS. 我们安装个tomacte服务器,开发web程序必须的!!如果测试后出现这个页面说明安装成功le ! 我们这个安装的是本地服务器,可以把we ...

  6. C/C++中printf和C++中cout的输出格式

    一. Printf 输出格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数据的类型, ...

  7. zabbix的agent端的主动模式关键三个参数

    如多主机超过300+和队列内容过多,就采用主动模式. [root@web03 zabbix]# egrep -v "^#|^$" zabbix_agentd.conf PidFil ...

  8. 数据库 Proc编程一

    proc编程 嵌入式sql:sql写入到C语言程序中 proc编程头文件路径 app\xxx\product\\dbhome_1\precomp\public proc编程要注意proc编译器也会使用 ...

  9. layDate/DatePicker日期时间空间

    真心不错,果断收藏了. 1.示例与效果 2.更多示例与皮肤 补充说明:My97DatePicker日期时间插件 的使用 1.示例与效果 2. 更多 常用的实例:WdatePicker下载 http:/ ...

  10. IE8 frameset SESSION丢失

    IE8 使用 frameset后,子页面,脚本触发父页面js函数, 如果使用 window.parent.location.href 跳转,则session会丢失 使用 window.location ...