go 函数高级运用

一、函数作用域

  • 说明
作用域的定义:已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围

在说函数作用域之前,先简单说一下局部变量和局变量
简单的说:
    全局变量:在一个文件中,任何地方都可以访问到的就是全局变量
    局部变量:在一个文件中,只有在某些特定的地方才能够访问到就是局部变量

根据作用域的定义和全局(局部)变量可以得知:
    全局变量 是 作用于全局作用域中的。
    局部变量 是 作用于局部作用域中的。
  • 实例
package main

import "fmt"

var PI float64 = 3.1415


// 圆的面积计算公式
func circle(r float64)(area float64){
	// area 局部变量,在main函数中无法使用
	// PI 全局变量 任何函数中都可以使用
	area = PI * (r * r)
	return
}

func main(){
	fmt.Println("PI :",PI)

	var R float64 = 3.5 // 此处的R 是main函数内的局部变量
	fmt.Println(circle(R))
}
根据上面的程序我们可以得知:
r、area 变量是作用于 circle函数内
R 变量是作用于main 函数内的

PI是全局变量,作用于整个程序中的

二、函数嵌套

  • 函数嵌套调用
package main

import "fmt"

func main(){
	fmt.Println(calc(11,33,"+"))
}


// calc 嵌套使用了sum/reduce
func calc(num1,num2 int,operator string) (num int,ok bool){
	switch operator {
	case "+":
		num = sum(num1,num2)
		ok = true
	case "-":
		num = reduce(num1,num2)
		ok = true
	}
	return
}

// 加
func sum(num1,num2 int)int{
	return  num1 + num2
}

// 减
func reduce(num1,num2 int)int{
	return  num1 - num2
}

三、函数作为参数

  • 函数作为参数1
package main

import "fmt"

func main(){
	num := calc(3,4,sum)
	fmt.Println(num)
}

// 三个参数
// 前两个是int类型
// 后一个是 func(int,int)int 类型   // 再go语言中fun 也是一种类型
// 返回int
func calc(num1,num2 int,f func(int,int)int)int{
	return f(num1,num2)
}


func sum(num1 ,num2 int)int{
	return  num1 + num2
}

  • 函数作为参数2(自定义类型)
package main

import "fmt"

// 自定义一个函数类型
// type 关键字
// cb 定义类型
// func(int,int)int 基于func(int,int)int 创建的新类型
type cb func(int,int)int

func main(){
	num := calc(3,4,sum)
	fmt.Println(num)
}

// 三个参数
// 前两个是int类型
// 后一个是 func(int,int)int 类型   // 再go语言中fun 也是一种类型
// 返回int
func calc(num1,num2 int,f cb)int{
	return f(num1,num2)
}


func sum(num1 ,num2 int)int{
	return  num1 + num2
}

四、闭包

  • 函数作为返回值
package main

import (
	"fmt"
	"time"
)
type farr func([10]int)int

func main(){
	nums := [10]int{3,29,100,51,30,4,192,32,43,12}
	maxNum := recordTime(max)
	fmt.Println(maxNum(nums))
}


// 记录函数运行时间
func  recordTime(f farr)farr{  // 返回一个函数
	return func(arr [10]int)int{
		start:=time.Now().UnixNano() // 纳秒数  1秒 == 1000 豪秒 == 1000000 微秒 == 1000000000 纳秒
		num := f(arr)

		time.Sleep(time.Second) // 停一秒
		
		end := time.Now().UnixNano()
		fmt.Println("函数执行纳秒数:",end-start)
		return num
	}
}

func max(arr [10]int)int{
	num := arr[0]
	for _,v := range arr{
		if num < v{
			num = v
		}
	}
	return num
}

如果喜欢看小说,请到183小说网

posted @ 2019-03-28 11:48  xiaobaiskill  阅读(750)  评论(0编辑  收藏  举报