go语言函数、方法、闭包(详解)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: go语言函数、方法、闭包(详解)

文章目录


前言


函数在数学中为两集合间的一种对应关系:输入值集合中的每项元素都能对应唯一一项输出值集合中的元素


在编程语言中函数为一类操作的集合体,具有一定的功能,有函数名、输入(参数)、输出(返回值)


一、什么是Go语言函数?


Go语言中支持多参数、多返回值


1.Go语言函数都包含什么?


函数声明


  func 函数名 (函数参数列表)(返回值类型){
    函数体
  }


函数参数


  值传递
  引用传递 
  函数可以作为另一个函数的实参进行回调


函数闭包(用于函数式编程,匿名函数)


  go编译器会对其进行识别,将闭包的变量存放在堆空间内
  并且闭包时不是返回了一个匿名函数,而是返回了一个结构体
  记录下函数返回地址和引用的环境中的变量地址
  同一个函数进行闭包,会因为环境变量的不同无法共享变量
  闭包函数内的变量进行改变会影响到当前所处的环境中的变量


函数方法


  函数方法要接收者函数,接收者函数可以是命名类型或者结构体类型的一个值或者一个指针。
  定义格式如下:
      接收者区域
    func(名称 类型)函数名()返回值类型{
      函数体
    }
  注意点:
    函数方法在执行时如果接收者是一个结构体,在函数内修改结构体数据,原结构体不会修改
    (会将结构体变量数据拷贝一份给和函数)
    如果是一个结构体指针,那么可以生效(直接将该结构体给函数)


2.简单的实现一个函数


代码如下(示例):


// 选最大值函数
//函数名
func maxs(a, b int) int {//括号内是参数列表,括号外int是返回值类型
  if a > b {
    return a
  } else {
    return b
  }
}


3.实现函数多参数


这里是在编写日志系统的时候写的一个输出日志的函数


代码如下(示例):


// 日志对象的方法,用于输出日志信息
//这里的args ...interface{}代表可以传任一个不同类型的参数
func (l LogGer) outLog(level logLevel, args ...interface{}) {
  if !l.eqLevel(level) {
    return
  }
  //看哪里调用这个函数了,哪里出错哪里调用,为了记录下出错的文件行号
  _, file, line, ok := runtime.Caller(2)
  file = strings.Split(file, "/")[len(strings.Split(file, "/"))-1]
  if !ok {
    return
  }
  filestr, _ := downloadLevel(level)
  fmt.Printf("[%s] [%s] [文件:%s] [行号:%d] 附加信息:", time.Now().Format("2006-01-02 15:03:04"), filestr, file, line)
  //对传进来的不定个参数进行解析
  for _, v := range args {
    fmt.Print(v)
  }
  fmt.Printf("\n")
}


4.实现函数多返回值


这里是在编写日志系统的时候写的一个输出日志的函数


代码如下(示例):


//返回int类型与错误类型
func judgeName(name string) (int, error) {
  if name=="jack"{
    return 0,nil
  }
  return -1, errors.New("传进来的不是jack")
}


二、什么是Go语言方法?


方法与函数有一定的区别,接口的话有所属的结构体作为接受者,相应的对象可以调用该方法,函数只实现了一定的功能,不能使用对象直接调用。


1.简单实现一个方法


代码如下(示例):


// 定义一个结构体并添加方法
type user struct {
  name        string
  age         int
  speak_array string
}
//属于结构体的方法
//这里的(Someone user)Someone是接受者名,user是类型还可以是user指针类型
func (Someone user) speak() {
  fmt.Printf("%s说:我今年%d岁,%s\n", Someone.name, Someone.age, Someone.speak_array)
}


二、什么是函数闭包?


func getSuperS() {
  //创建一个函数变量数组
  var temp [3]func() int
  j := 0
  for i := 0; i < 3; i++ {
    //直接使用当前所处环境中的j
    temp[i] = func() int {
      j++
      return j
    }
  }
  /*
    函数闭包使用的是该匿名函数所处环境的变量,如果变量重新声明
    就导致匿名函数使用的变量不同,结果也就是不再共享一个变量
    j定义在for外部,每次生成匿名函数使用的都是使用的同一个j
    (在for循环内部改变j的值不会影响该性质)
    j定义在for循环内部,每一次循环将产生一个新的j变量,三个匿名函数使用的也就不是同一个j了
  */
  fmt.Println(temp[0](), temp[0](), temp[0]())
  fmt.Println(temp[1](), temp[1](), temp[1]())
  fmt.Println(temp[2](), temp[2](), temp[2]())
}


总结


Go语言是一门面向过程编程语言,但是合理的使用函数也可以达到与面向对象编程语言类似的结果,Go语言函数灵活,操作也较为方便。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
10天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
30 2
|
8天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
19 2
|
8天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
21 2
|
3天前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
16 4
|
3天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
26 1
|
6天前
|
Go
go语言中的continue 语句
go语言中的continue 语句
16 3
|
7天前
|
安全 Go 调度
探索Go语言的并发模型:goroutine与channel
在这个快节奏的技术世界中,Go语言以其简洁的并发模型脱颖而出。本文将带你深入了解Go语言的goroutine和channel,这两个核心特性如何协同工作,以实现高效、简洁的并发编程。
|
8天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
17 4
|
8天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
40 1
|
1天前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
11 0
下一篇
无影云桌面