zoukankan      html  css  js  c++  java
  • 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小说网

  • 相关阅读:
    开始研究web,mark一下
    干掉Unity3D
    mysql NDB
    mysql federated engine
    mysql memory
    mysql merge
    mysql innodb 引擎
    mysql myisam
    mysql 的日志文件
    mysql 的数据文件
  • 原文地址:https://www.cnblogs.com/xiaobaiskill/p/10613942.html
Copyright © 2011-2022 走看看