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. IBM MQ 2035 或 2013认证错误的解决方法

    第一种方法: ALTER CHL(SYSTEM.BKR.CONFIG) CHLTYPE(SVRCONN) ALTER CHL(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN ...

  2. UIImageView只显示一半

    本来正常的话,UIImageView会在UIScrollView内占满的,但是第一个UIImageView只占了高度的一半左右.如下图,红色的是UIScrollView的背景色,还有那么多没有填充,但 ...

  3. openvpn 移植之生成证书和私钥

    openvpn 是通过 openssl 的各种验证进行连接的,生成证书的过程可以在 Ubuntu 的环境下生成. 步骤如下: 一. 在Ubuntu下安装 openvpn // 这是在 Ubuntu 1 ...

  4. [TI-Sitara]启动流程

    前段时间在准备AM437x启动相关的一些事情,对MLO.SPL等事情也是有些糊涂,于是分享下面这篇文章 转自:http://blog.csdn.net/psvoldemort/article/deta ...

  5. ardunio I2C

    I2C总线定义I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.在主从通信中,可以有多个I2C总线器件同 ...

  6. 日期-date.js

    Date.prototype.format = function(format) { var o = { "M+" : this.getMonth() + 1, // 月 &quo ...

  7. Matlab 实现神经网络实例

    % Matlab实现简单BP神经网络 % http://blog.csdn.net/zjccoder/article/details/40713147 : %样本个数 xx(i)=*pi*(i-)/; ...

  8. Loadrunner_http长连接设置

    最近协助同事解决了几个问题,也对loadrunner的一些设置加深了理解,关键是更加知其所以然. ljonathan http://www.51testing.com/html/48/202848-2 ...

  9. 【NLP】新词发现

    http://www.csdn.net/article/2013-05-08/2815186 http://blog.csdn.net/yuyu2223/article/details/7725705 ...

  10. Android API Guides---Bluetooth

    Bluetooth Android平台包含蓝牙网络协议栈,它同意设备以无线方式与其他蓝牙设备进行数据交换的支持.应用程序框架提供了訪问通过Android蓝牙API的蓝牙功能.这些API使应用程序无线方 ...