Go笔记-函数
【函数定义】
【函数类型】
- 普通的带有名字的函数
- 匿名函数或者lambda函数
- 方法(Method)(与结构体有关)
- 特殊的有main(),init()函数
【函数的书写格式及调用说明】
- 包中的函数若想被外部调用,函数必须首字母大写
- Go中函数重载是不被允许的,会导致一个编译错误
- 函数也可以作为一个函数类型来声明
- 函数可以赋值给变量
- 一个变量不能被赋值不同的函数,就像一个变量不能被声明多次一样的道理
- Go没有泛型的概念
- 函数不能在其他函数里嵌套声明,也就是说不能再函数体内声明(创造)函数,一般在函数体内使用匿名函数来完成这个
- 函数值之间可以互相比较,如果它们引用的是相同的函数或者都是nil的话,则认为它们是相同的
【函数的参数】
【函数的返回值】
// 举例
package main import "fmt" var num int = 10
var numx2, numx3 int func main(){
numx2, numx3 = getX2AndX3(num)
PrintValues()
numx2, numx3 = getX2AndX3_2(num)
PrintValues()
} func PrintValues(){
fmt.Printf("num = %d, 2x num = %d, 3x num = %d\n", num, numx2, numx3)
} func getX2AndX3(input int)(int, int){ // 定义了函数返回的参数个数及参数类型
return 2 * intput, 3 * input
}
// 使用了命名返回值
func getX2AndX3_2(input int)(x2 int, x3 int){
x2 = 2 * input
x3 = 3 * input
// return x2, x3
return // 因为使用了命名返回值,所以return的时候,就按照命名返回值的变量返回。
}
【传递变长参数】
package main
import "fmt"
func main(){
x := min(1,3,2,0)
fmt.Printf("The minimum is: %d\n", x)
arr := []int{7,9,3,5,1}
x = min(arr...)
fmt.Printf("The minimum in array arr is:%d",x)
}
func min(a ...int)int{
if len(a) == 0 {
return 0
}
min := a[0]
for _, v := range a{
if v < min {
min = v
}
}
return min
}
【defer和追踪】
// 示例
package main import "fmt" func main(){
funciton1()
} func function1(){
fmt.Printf("In function1 at the top\n")
defer function2()
fmt.Printf("In function1 at the bottom\n")
} func function2(){
fmt.Printf("function2:Defered until the end of the calling function!")
} // 输出
In function1 at the top
In function1 at the bottom
function2:Defered until the end of the calling function
【递归函数】
package main
import "fmt"
func main(){
result := 0
for i := 0; i<=10;i++{
result = fibonacci(i)
fmt.Printf(result)
}
}
func fibonacci(n int)(ret int){
if n < 2{
ret = 1
}else{
ret = fibonacci(n-1)+fibonacci(n-2)
}
return
}
package main
import "fmt"
func main(){
var n int = 30
result := factorial(n)
fmt.Printf("n的阶乘是:%d",result)
}
func factorial(n int)(res int){
if n > 0{
res = n * factorial(n-1)
}else{
res = 1
}
return
}
【闭包的应用:将函数作为返回值】
package main
import "fmt"
func main(){
func_param1 := add1(2)
fmt.Println(func_param1(3))
func_param2 := add2()
fmt.Println(func_param2(3))
}
func add1(n int) func(a int) int{
return func(a int) int{
return a + n
}
}
func add2() func(a int) int{
return func(a int) int{
return a + 2
}
}
// 输出结果
5
5
package main
import "fmt"
func main(){
var f = add()
fmt.Println(f(10))
fmt.Println(f(20))
fmt.Println(f(30))
}
func add() func(a int) int{
var x int
return func(a int) int{
x += a
return x
}
}
// 输出结果
10
30
60
package main
import "fmt"
func main(){
var i int
f := fibonacci()
for i = 0; i < 10; i++{
fmt.Println(f(i))
}
}
func fibonacci() func(a int) int{
var res int
var last int
var last_last int
return func(a int) int{
if a < 2{
res = a
}else{
res = last_last + last
}
last_last = last
last = res
return res
}
}
Go笔记-函数的更多相关文章
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- 《python基础教程(第二版)》学习笔记 函数(第6章)
<python基础教程(第二版)>学习笔记 函数(第6章) 创建函数:def function_name(params): block return values 记录函数:def f ...
- <数据结构与算法分析>读书笔记--函数对象
关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...
- swift swift学习笔记--函数和闭包
使用 func来声明一个函数.通过在名字之后在圆括号内添加一系列参数来调用这个方法.使用 ->来分隔形式参数名字类型和函数返回的类型 func greet(person: String, day ...
- 《JS语言精粹》学习笔记 函数部分の闭包
要理解闭包,首先要理解变量作用域,变量的作用域就两种,全局变量和局部变量,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量. 闭包定义:能读取函数内部局部变量的函数就是闭包,而只有函数 ...
- Python学习笔记——函数
1.标准类型内建函数 <1>type() —— 返回对象的类型 <2>cmp() —— 比较两个对象,返回两个对象的ASCII码的差 <3>str().repr() ...
- golang笔记——函数与方法
如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...
- JavaScript笔记:函数
函数是定义一次但却可以调用或执行任意多次的代码块. 一.函数定义 javascript中的函数使用function关键字来定义,常用的函数定义分为三种形式: 声明式函数定义 function sum( ...
- JavaScript学习笔记-函数
函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...
- JavaScript学习笔记-函数实例
函数实例 var p = { a:15, b:'5', f1:function(){ var self = this; console.log(self.a+self.b); f2(); functi ...
随机推荐
- 51 nod 1628 非波那契树
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1628 花了一个早上+半个下午终于把这题切掉了…… (膜出题人) ...
- 2017ecjtu-summer training #4 CodeForces 731C
C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3483 A Very Simple Problem Time Limit: 4000/2000 MS ( ...
- MVC学习笔记(分享)
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...
- UEP-弹窗给选中数据赋值
弹窗给选中数据赋值:t/** * 设置分派员 */ function onDispatchMan(){ var rec=ajaxgrid.getCheckedRecords(); if(rec.len ...
- 用AngularJS实现对表格的增删改查(仅限前端)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 图tp delDataById问题
- mysql中OPTIMIZE TABLE的作用
转载▼ 1.先来看看多次删除插入操作后的表索引情况 mysql> SHOW INDEX FROM `tbl_name`; +----------+------------+----------- ...
- HTTP协议的简单介绍
前传:HTTP协议的演变过程 HTTP(HyperText Transfer Protocol)协议是基于TCP的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是 ...
- 为什么alertView弹出后button会消失的问题
按option后会有提示:Do not use the label object to set the text color or the shadow color. Instead, use the ...