一、函数作用域

  • 说明
  1. 作用域的定义:已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围
  2. 在说函数作用域之前,先简单说一下局部变量和局变量
  3. 简单的说:
  4. 全局变量:在一个文件中,任何地方都可以访问到的就是全局变量
  5. 局部变量:在一个文件中,只有在某些特定的地方才能够访问到就是局部变量
  6. 根据作用域的定义和全局(局部)变量可以得知:
  7. 全局变量 作用于全局作用域中的。
  8. 局部变量 作用于局部作用域中的。
  • 实例
  1. package main
  2. import "fmt"
  3. var PI float64 = 3.1415
  4. // 圆的面积计算公式
  5. func circle(r float64)(area float64){
  6. // area 局部变量,在main函数中无法使用
  7. // PI 全局变量 任何函数中都可以使用
  8. area = PI * (r * r)
  9. return
  10. }
  11. func main(){
  12. fmt.Println("PI :",PI)
  13. var R float64 = 3.5 // 此处的R 是main函数内的局部变量
  14. fmt.Println(circle(R))
  15. }
  1. 根据上面的程序我们可以得知:
  2. rarea 变量是作用于 circle函数内
  3. R 变量是作用于main 函数内的
  4. PI是全局变量,作用于整个程序中的

二、函数嵌套

  • 函数嵌套调用
  1. package main
  2. import "fmt"
  3. func main(){
  4. fmt.Println(calc(11,33,"+"))
  5. }
  6. // calc 嵌套使用了sum/reduce
  7. func calc(num1,num2 int,operator string) (num int,ok bool){
  8. switch operator {
  9. case "+":
  10. num = sum(num1,num2)
  11. ok = true
  12. case "-":
  13. num = reduce(num1,num2)
  14. ok = true
  15. }
  16. return
  17. }
  18. // 加
  19. func sum(num1,num2 int)int{
  20. return num1 + num2
  21. }
  22. // 减
  23. func reduce(num1,num2 int)int{
  24. return num1 - num2
  25. }

三、函数作为参数

  • 函数作为参数1
  1. package main
  2. import "fmt"
  3. func main(){
  4. num := calc(3,4,sum)
  5. fmt.Println(num)
  6. }
  7. // 三个参数
  8. // 前两个是int类型
  9. // 后一个是 func(int,int)int 类型 // 再go语言中fun 也是一种类型
  10. // 返回int
  11. func calc(num1,num2 int,f func(int,int)int)int{
  12. return f(num1,num2)
  13. }
  14. func sum(num1 ,num2 int)int{
  15. return num1 + num2
  16. }
  • 函数作为参数2(自定义类型)
  1. package main
  2. import "fmt"
  3. // 自定义一个函数类型
  4. // type 关键字
  5. // cb 定义类型
  6. // func(int,int)int 基于func(int,int)int 创建的新类型
  7. type cb func(int,int)int
  8. func main(){
  9. num := calc(3,4,sum)
  10. fmt.Println(num)
  11. }
  12. // 三个参数
  13. // 前两个是int类型
  14. // 后一个是 func(int,int)int 类型 // 再go语言中fun 也是一种类型
  15. // 返回int
  16. func calc(num1,num2 int,f cb)int{
  17. return f(num1,num2)
  18. }
  19. func sum(num1 ,num2 int)int{
  20. return num1 + num2
  21. }

四、闭包

  • 函数作为返回值
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. type farr func([10]int)int
  7. func main(){
  8. nums := [10]int{3,29,100,51,30,4,192,32,43,12}
  9. maxNum := recordTime(max)
  10. fmt.Println(maxNum(nums))
  11. }
  12. // 记录函数运行时间
  13. func recordTime(f farr)farr{ // 返回一个函数
  14. return func(arr [10]int)int{
  15. start:=time.Now().UnixNano() // 纳秒数 1秒 == 1000 豪秒 == 1000000 微秒 == 1000000000 纳秒
  16. num := f(arr)
  17. time.Sleep(time.Second) // 停一秒
  18. end := time.Now().UnixNano()
  19. fmt.Println("函数执行纳秒数:",end-start)
  20. return num
  21. }
  22. }
  23. func max(arr [10]int)int{
  24. num := arr[0]
  25. for _,v := range arr{
  26. if num < v{
  27. num = v
  28. }
  29. }
  30. return num
  31. }

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

go 函数高级运用的更多相关文章

  1. Scala学习——函数高级操作

    scala函数高级操作 一.字符串高级操作 多行字符串和插值 package top.ruandb.scala.Course06 object StringApp { def main(args: A ...

  2. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

    1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

  3. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  4. 【357】sorted 函数高级用法

    参考:Python 内置函数sorted()在高级用法 - Brad1994 - 博客园 sorted 函数主要实现的就是对于可迭代对象进行排序,对于一维数据排序很好理解与实现,直接调用即可,本文主要 ...

  5. Scala函数高级操作

    字符串高级操作:***** 非常重要 将函数赋值给变量/值def sayHello(name:String): Unit = { println(s"Hello:$name")} ...

  6. Scala中的函数高级使用

    1.偏函数 1.基本介绍 在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范 ...

  7. pandas函数高级

    一.处理丢失数据 有两种丢失数据: None np.nan(NaN) 1. None None是Python自带的,其类型为python object.因此,None不能参与到任何计算中. #查看No ...

  8. Oracle 函数高级查询

    目录 oracle高级查询 Oracle SQL获取每个分组中日期最新的一条数据 求平均值(为0的参数不均摊) 字符串清除前面的0 判断字符串串是否包含某个字符串 switch 判断 oracle不足 ...

  9. Scala函数高级篇

    一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...

  10. js高级之函数高级部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 原型与原型链 prototype : 显式原型属性,它默认指向一个Object空对象(即称为: ...

随机推荐

  1. javascript 大数据处理方法

    随着前端的飞速发展,在浏览器端完成复杂的计算,支配并处理大量数据已经屡见不鲜.那么,如何在最小化内存消耗的前提下,高效优雅地完成复杂场景的处理,越来越考验开发者功力,也直接决定了程序的性能. 本文展现 ...

  2. Sping bean的作用域

    单例(Singleton):在整个应用中,只创建bean的一个实例.(默认) 原型(Prototype):每次注入或者通过Sping应用上下文获取的时候,都会创建一个新的bean. 回话(Sessio ...

  3. wing ide破解

    LicenseID='CN123-12345-12345-67891' # RequestCode='RL634-8363J-X7E8K-95XD3' RequestCode = 'RW61C-NN6 ...

  4. C解析config

    #cat bb.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  5. 00.continue break return的使用场景

    continue continue 语句跳出本次循环,而break跳出整个循环. continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环. continue语句用在w ...

  6. homework week 1

    第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...

  7. ggplot画图笔记

    1.数据集相加符号 %+% 2.图形属性映射 aesc()函数 aes(x=mpg,y=wt)  把mpg属性映射为x,wt属性映射为y 图层图形属性可以添加.修改和删除映射. 如 3.位置调整参数 ...

  8. 【ACM】hdu_1276_士兵队列训练问题_201308131032

    士兵队列训练问题Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. 个人常常使用的一些Eclipse技巧

    引言 为了加快开发效率,方便地浏览源代码,重构以及重写一些方法等,Eclipse给我们提供了非常多方便的快捷键以及小技巧.以下是我总结一下经常使用的快捷键和技巧. 快捷键 清理控制台(console) ...

  10. 大型项目开发: 隔离 (《大规模C++程序设计》书摘)

    书中第六章 隔离. 主要在撰述什么须要定义在头文件?什么应当移到编译单元中? 核心仍然是先区分接口定义与实现细节.实现细节的改变会导致客户代码的又一次编译,从逻辑上也表示与客户代码间可能存在着强耦合. ...