函数
func 函数名(传入参数列表/*变量名 类型*/) (返回参数列表/*变量名 类型*/) {
函数体
(需要给返回参数变量赋值)
return //返回的时候就直接返回所有返回参数变量的值了
}
- 函数名根据约定,小写开头为私有,大写开头为公有
- 传入参数声明不能设置默认值
- 不定参数类型可以声明为
变量名(一般为args) ...类型
- 不定参数类型可以传任意个数的参数
- 不定参数类型只能放在最右边
- 一个函数只能存在一种不定参数类型。例如以下则会报错:
- 不定参数的传递,可以通过
args...
来进行全部传递,也可以通过args[(开始位置(包括本身)):(结束位置(不包括本身))]
的切片方式进行传递。若哪边省略不写则说明包括哪边的全部元素。
函数类型(相当于把自己定义的函数当作类型初始化给变量)
有点类似于Java的接口?多态?
type 想起的函数名称 func(待传入的参数/*参数类型*/) (待返回的参数/*参数类型*/)
func Add(a int, b int) (result int) {
result = a + b
return
}
func main(){
var 自己起的函数变量名 想起的函数名称
自己起的函数变量名 = Add
c := 自己起的函数变量名(3, 2)
fmt.Printf("%d", c)
}
- 相当于给函数起了一个名称,当实例化函数类型后,可以把所有类型相符的函数初始化给那个函数变量
- 函数类型可以作为参数被传递(多态的实现)
type FuncType func(int, int) (result int)
func Calc(a int, b int, funcType FuncType) (result int) {
result = funcType(a, b)
return
}
func main() {
}
匿名函数和闭包
//赋给变量
func1 := func(i int, j int) (result int) {
if i < j {
result = i
}else {
result = j
}
return result
}
result := func1(1, 2)
//直接调用
result := func (i int, j int) (result int) {
if i < j {
result = i
}else {
result = j
}
return result
}(1, 3)
- 可以调用内部函数外的数据。
- 内部函数修改外部数据后,数据在外部也会改变。闭包是以引用方式捕获外部变量。
- 闭包不关心捕获的常量和变量是否已经超出作用域,只要闭包还在使用,它就一直存在。例如
func FuncTest() (resultFunc func() (resultInt int)){
var x int
resultFunc = func() (resultInt int) {
x++
resultInt = x*x
return
}
return
}
func main() {
funcTest := FuncTest()
fmt.Printf("%d\t", funcTest())
fmt.Printf("%d\t", funcTest())
fmt.Printf("%d", funcTest())
}
//输出结果为
1 4 9