这篇文章主要讲解了“去语言中函数,闭包和递归是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习”去语言中函数,闭包和递归是什么意思”吧!
去函数特点:无需声明原型。支持不定变参。返回值类型写在最后面,支持多返回值。支持命名返回参数。支持匿名函数和闭包。函数也是一种类型,一个函数可以赋值给变量。不支持嵌套(嵌套的)一个包不能有两个名字一样的函数。不支持重载(超载)。不支持默认参数(默认参数),可选参数。参数传递:无论是值传递,还引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝。
<强>使用关键字func定义函数,左大括号依旧不能另起一行。强>
去函数声明:
包主要
进口“fmt"
函数测试(fn func () int) int {
返回fn ()
}
//定义函数类型。
类型FormatFunc func (s字符串,x, y int)字符串
函数格式(fn FormatFunc s字符串,x, y int)字符串{
返回fn (x, y)
}
函数主要(){
s1:=测试(func () int{100})//直接将匿名函数当参数。
s2:=格式(func (s字符串,x, y int)字符串{
fmt返回。Sprintf (x, y)
},“% d % d", 10, 20)
println (s1, s2)
}
//返回结果
//100年10,20
<强>去函数参数强>
函数可以通过两种方式来传递参数:
值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
在默认情况下,去语言使用的是值传递,即在调用过程中不会影响到实际参数。
注意1:无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。
注意2:地图,切片,chan指针,接口默认以引用的方式传递。
任意类型的不定参数:就是函数的参数和每个参数的类型都不是固定的。
{}用接口传递任意类型数据是去语言的惯例用法,而且界面{}是类型安全的。
func myfunc (args…接口{}){
}
使用片对象做变参时,必须展开。(片…)
包主要
import (
“fmt"
)
函数测试字符串(字符串,n…int) {
var int x
_,我:=n范围{
x +=
}
fmt返回。Sprintf(年代,x)
}
函数主要(){
s:=int [] {1,2,3}
res:=测试(“总和:% d" s…)//片……展开片
println (res)
}
<强>去函数返回值强>
“_"标识符,用来忽略函数的某个返回值
去的返回值可以被命名,并且就像在函数体开头声明的变量那样使用。
返回值的名称应当具有一定的意义,可以作为文档使用。
<强>匿名函数强>
匿名函数是指不需要定义函数名的一种函数实现方式。
里在去面,函数可以像普通变量一样被传递或使用,去语言支持随时在代码里定义匿名函数。
匿名函数由一个不带函数名的函数声明和函数体组成。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
包主要
import (
“fmt"
“math"
)
函数主要(){
getSqrt:=func (float64) float64 {
返回math.Sqrt (a)
}
fmt.Println (getSqrt (4)
}
//返回2
//
上面先定义了一个名为getSqrt的变量,初始化该变量时和之前的变量初始化有些不同,使用了函数,函数是定义函数的,可是这个函数和上面说的函数最大不同就是没有函数名,也就是匿名函数。这里将一个函数当做一个变量一样的操作。
Golang匿名函数可赋值给变量,做为结构字段,或者在通道里传送。
包主要
函数主要(){
//淞俊?/p>
fn:=func () {println (“Hello, World !“)}
fn ()
//稀?/p>
fn:=[] (func (int x) int) {
func (int x) int{返回x + 1},
func (int x) int{返回x + 2},
}
println (fn [0] (100)
//魑侄巍?/p>
d:=struct {
fn func()字符串
} {
fn: func(){字符串返回“你好,世界!“},
}
println (d.fn ())
//- - -通道的功能- - - - - -