函数

函数是可以重复调用有一定功能或者作用的代码块,用关键字func定义

01 基本用法

  • 定义

语法

func 函数名(参数名 参数类型,参数名 参数类型)(返回值类型){
	函数体
	return 返回值
}

注意:

​ 函数名,只能是字母数字下划线,且不能以数字开头,建议驼峰体。

​ 如果被调用的函数建议大驼峰体

​ 在同一个包下函数名不能重复

​ 可变长参数只能放在所有参数之后,且只能有一个

​ 返回值是多个时,返回值的类型必须用括号括起来

一般用法

package main

import "fmt"

func main() {
  num := Add(1, 2)
  fmt.Println(num) // 3
}

func Add(x int, y int)(int){
  return x + y
}

参数类型相同时

package main

import "fmt"

func main() {
  num := Add(1, 2)
  fmt.Println(num) // 3
}

func Add(x, y int)(int){ // x,y都是整型
  return x + y
}

可变长参数

package main

import "fmt"

func main() {
  num := Add(1, 2, 3, 4)
  fmt.Println(num) // 10
}

func Add(x int, y ... int)(int){ // y是切片类型,可变长参数必须放在正常参数的后边,且只能有一个可变长参数
  for _, value := range y{
    x += y
  }
  return x
}

指定返回值名字

package main

import "fmt"

func main() {
  num := Add(1, 2)
  fmt.Println(num) // 3
}

func Add(x, y int)(z int){ // x,y都是整型,相当于z被定义,且为零值
  z = x + y
  return // 直接return就会把z的最终结果作为返回值返回
}

多个返回值

package main

import "fmt"

func main() {
  a, b := Add(1, 2) // 必须要两个变量接收
  fmt.Println(num) // 3
}

func Add(x, y int)(int, int){ // x,y都是整型,相当于z被定义,且为零值,且返回值类型,必须用括号括起来
  z = x + y
  return x, y  // 返回值直接用括号隔开
}

02 作用域

全局作用域,所有函数能调用

package main

import "fmt"

var a int = 10

func main() {
  fmt.Println(a) // 10
}

func TestFunc(){
  fmt.Println(a) //10
}

局部作用域定义声明的变量,只能在局部使用,且在局部作用域里覆盖全局变量

package main

import "fmt"

var a int = 10

func main() {
  fmt.Println(a) // 10
}

func TestFunc(){
  a := 20
  fmt.Println(a) // 20
}

03 函数类型与变量

可以自定义函数类型,且函数可以作为变量使用

自定义函数类型

package main

import "fmt"

func main() {
  var b a // 声明一个a函数类型的变量b
  b = add // 同类型的变量赋值
  fmt.Println(b(1, 2)) // 3
}

type a func(int, int)(int) // a就是一个函数类型

func add(x, y int)(int){  // 函数add是a函数类型的函数
  return x + y
}

注意:

​ 函数add就是a函数类型

函数作为参数

package main

import (
	"fmt"
)


func main() {
	b := PFunc(1, PFFunc)
	fmt.Println(b)

}

func PFunc(x int, y func(int)(int))(int)  { // 参数y是一个函数
	a := y(x)
	fmt.Println(a)
	return a
}

func PFFunc(z int)(int)  {
	return z
}

函数作为返回值

package main

import (
	"fmt"
)

func main() {
	f := FFunc() // f是一个函数
	fmt.Println(f()) // 调用函数

}

func FFunc() (func()int) {
	return AFunc //  函数AFunc作为返回值

}
func AFunc() int {
	return 1

}

04 匿名函数

赋值给一个变量

package main

import (
	"fmt"
)

func main() {
	a := func(x, y int) (int){
		return x + y
	}
	fmt.Println(a(1, 2))

}

直接调用

package main

import (
	"fmt"
)

func main() {
	fmt.Println(func(x, y int) (int){
		return x + y
	}(1, 2))
}

05 闭包函数

一个函数在另一个函数内部,且把内部函数作为返回值返回,内部函数为匿名函数

package main

import (
	"fmt"
)

func main() {
	b := BIBFunc()
	fmt.Println(b(3, 4, 5))
}

func BIBFunc()(func(... int)int)  {
	k := 0
	return func (x ... int) int {
		for _, value := range x{
			k += value
		}
		return k
	}
}

06 defer

defer会延迟处理,像异步的效果,代码从上到下运行完后,被defer修饰的代码才从下向上运行

package main

import (
	"fmt"
)

func main() {
	fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	fmt.Println(4)
} //  结果是1,4,3,2
posted @ 2021-03-10 10:09  tianzhh_lynn  阅读(22)  评论(0编辑  收藏  举报