老雷go语言视频教程之Go语言的函数func
老雷go语言视频教程之函数func
一、函数定义
func add(a int,b int) int {
return int
}func: 函数声明
add: 函数名称
(a int,b int):函数参数
int:返回类型
二、函数调用
m:=add(1,2)
三、函数参数
函数参数可分按 值传递、引用传递
1、值传递:最常用
func add(a int,b int)
2、引用传递,可改变外部变量
func add2(a *int)
var m=1;
add2(&m);
3、可变参数:...type
func min(p ...int)
4、使用函数作为参数
函数:需要完整的声明
func callback(i int, f func(int, int) int) int {
return f(i, 2)
}四、函数返回值
函数返回: return
命名的返回值: (m int,b int)
func add3(a int,b int) (m int,n int){
m=a+b
n=a*b
return
}多返回参数:
m,n=add3(1,2)
空白符:_ 忽略返回值
m,_=add3(1,2)
五、defer 延时到函数返回之前执行
func d(){
defer fmt.Print("defer")
fmt.Print("defer before")
}
六、递归函数
当一个函数在其函数体内调用自身,则称之为递归
func for3(a int) {
if a > 3 {
fmt.Print(a)
a--
for3(a)
}
}七、闭包,匿名函
闭包:没有名字的函数,通常是临时内部调用
func(x int, y int) int { return x + y }
直接执行闭包:结尾()调用
func (x int){}(1)
a(1)
闭包可以赋值给变量
g :=func(int a){}
作为函数返回:
func refun(a int) func(b int) {
return func(b int) {
fmt.Print(a + b)
}
}
课后作业:
写一个函数实现a,b两个人的石头剪刀布游戏
a=石头,b=布
func ganme(a,b){
return 谁赢了
}
package main
import (
"fmt"
)
func main() {
m := add(1, 2)
var i = 1
add2(&i)
n := callback(2, add)
c, d := add3(1, 2)
z := min(8, 5, 4, 2)
fmt.Print(m, i, n, c, d, z)
defer2()
for3(10)
fn1()
fn2()
//函数作为返回值
re1 := refun(5)
re1(2)
}
func add(a int, b int) int {
return a + b
}
func add2(m *int) {
*m++
}
func callback(i int, f func(int, int) int) int {
return f(i, 2)
}
func add3(a int, b int) (m int, n int) {
m = a + b
n = a * b
return
}
func min(p ...int) int {
if len(p) == 0 {
return 0
}
min := p[0]
for _, v := range p {
if v < min {
min = v
}
}
return min
}
func defer2() {
defer fmt.Print("defer")
fmt.Print("defer before")
}
func for3(a int) {
if a > 3 {
fmt.Print(a)
a--
for3(a)
}
}
func fn1() (ret int) {
defer func() {
ret++
}()
return 1
}
func fn2() {
g := func(a int) {
fmt.Printf("%d 除 3= %d", a, a%3)
}
for i := 0; i < 5; i++ {
g(i)
}
}
func refun(a int) func(b int) {
return func(b int) {
fmt.Print(a + b)
}
}