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. 深入浅出Spring(一)Spring概述

    现在很多的企业级项目中基本上都会用到了Spring框架,那么为什么会出现Spring,Spring是什么?这次的博文我主要为大家简单介绍一下Spring. Java EE优缺点 我们都知道在2003年 ...

  2. Python字符与ASCII码转换

    有两个内置函数,记得以前在<Python Cookbook>里看到过. >>>print ord('a') 97 >>>print chr(97) a

  3. 基于jQ+CSS3页面滚动内容元素动画特效

    今天给大家分享一款基于jQ+CSS3页面滚动内容元素动画特效.这是一款基于jQuery+CSS3实现的页面滚动代码.该实例适用于适用浏览器:360.FireFox.Chrome.Safari.Oper ...

  4. Excel 自定义关闭按钮

    遇到过这样一个需求,是在excel关闭的时候,不要excel本身的保存窗口,只用自定义的. 这个的需要第一,是点击关闭时候触发, 第二:触发后,不能还是弹出那个窗口 第三:取消后,要能停止程序 为了弄 ...

  5. vmware无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件

    原因: 是虚拟机服务没有开启 解决方法:(以管理员的方式运行) 点击“开始→运行”,在运行框中输入 CMD  回车打开命令提示符,然后依次执行以下命令. net start vmcinet start ...

  6. Webpack实例教程及模块化规范

    Webpack 是当下最热门的前端资源模块化管理和打包工具.它能够将很多松散的模块依照依赖和规则打包成符合生产环境部署的前端资源. 通过 loader 的转换,不论什么形式的资源都能够视作模块,比方 ...

  7. Toad 补充与培训 & 常用菜单

    Toad 常用菜单 新版本 toad 软件中, 比较有用的菜单 (toad10.6 版本) 下边菜单, 在日常工作中出现过的, 显示为 粉色 , 蓝色 表示次一级的重要 session 菜单 new ...

  8. CSS浮动与清除浮动(overflow)例子

    在css中浮动与清除浮动功能是我们开发中常用到的一个功能了,下面小编来为各位分析关于CSS浮动与清除浮动(overflow)例子吧. float脱离文本流,可是为什么文字却会有环绕的效果,这点实在是神 ...

  9. Unity的 Stats 窗体, Batched、SetPass、Draw Call 等

    孙广东  2015.8.12 在Game View 中的右上角有一个统计数据 Stats button.当按下button时.覆盖窗体显示,可用于优化性能的实时渲染统计信息. 确切的统计数据显示生成目 ...

  10. PHP实现对站点内容外部链接的过滤方法

    熟悉SEO的朋友都知道,对于网站外部链接失效的情况如果链接带有rel="nofollow"属性可以避免不必要的损失.本文就以实例形式演示了PHP实现对站点内容外部链接的过滤方法.具 ...