首页 后端开发 Golang go语言中函数是什么意思

go语言中函数是什么意思

Dec 08, 2022 pm 07:48 PM
go golang go语言 函数

在go语言中,函数是组织好的、可重复使用的、用来实现单一具体或相关联功能的代码段(块);其主要目的是提高应用的模块性和代码的重复利用率,更好的管理代码,模块化开发。函数通常使用参数和返回值,与调用者交互数据;参数给函数传递数据,返回值,函数将处理好的数据传递给调用者。

go语言中函数是什么意思

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段,其可以提高应用的模块性和代码的重复利用率。

函数概述

函数,function,独立的,用于实现具体功能的代码块。主要目的,是代码的重用(重复使用),更好的管理代码,模块化开发。 函数通常使用参数和返回值,与调用者交互数据。参数给函数传递数据,返回值,函数将处理好的数据传递给调用者。 Go语言中函数被称为一等公民(first-class)。意味着支持高阶函数,支持匿名函数,支持闭包等特性,可以满足接口等高级函数特性。

函数定义

函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。

语法:

  • 定义:

func 函数名(形参列表)(返回值类型列表) {
  函数体,通常会有return语句,返回值
}
登录后复制
  • 调用:

函数名(实参列表)
登录后复制

函数名:函数的标识符,用于找到函数,内部是一个指向函数代码的地址。 形参列表:由变量和类型构成 返回值类型列表:函数返回值的类型,多个返回值需要指定多个。 函数体:实现函数功能的具体语句。 return语句:返回值语句

以上定的为命名函数,不能定义在其他函数内部。

函数参数

用于在调用函数时向函数传递数据。 实参,实际参数。调用时给的参数。指的是具有的特定实际数据的参数。 形参,形式参数。定义时使用的参数。指的是用来表示函数需要参数,而定义时参数是没有任实际何数据的。 当调用时会发生使用实参为形参变量赋值的过程,称为参数的传递。在函数的执行期间,形参是有具体数据的,形参当于函数内声明的变量。

参数的传递,分为值传递,地址传递两种方式。地址传递时,需要形参定义为指针类型,调用时需要取得地址传参。示例代码:

func funcTest(p1 int, p2 *int) {
  p1++
  *p2++
  fmt.Println(p1, *p2)
}
func main() {
  var (
    a1 = 42
    a2 = 42
  )
  funcTest(a1, &a2)
  // 参数赋值过程
  fmt.Println(a1, a2)
}
登录后复制

以上会输出

43 43
42 43
登录后复制

值传递,函数会得到实参的一份拷贝。地址传递,函数会得到实参地址,这样函数内通过地址对变量的修改,同时影响实参。

Go支持rest...不定数量参数,定义时将不定数量形参放在形参列表的最后定义,使用 ...Type的方式,演示:

定义:
func funcTest(op string, nums ...int) {
  fmt.Println(nums) // [4, 1, 55, 12], slice切片型数据
}
调用
funcTest("someOp", 4, 1, 55, 12)
登录后复制

接收到的参数为slice切片类型。

函数返回值

return语句用于生成返回值。需要在函数定义时确定返回值类型,支持多值返回。演示语法:

func funcTest() (int, string) {
  return 42, "Hank"
}
登录后复制

可以在定义时,声明返回的变量。这个做法叫命名返回,演示为:

func funcTest() (num int, title string) {
  num = 42
  title = "Hank"
  return
}
登录后复制

不用return任何数据,直接return即可!

函数变量

函数可以看作一种特殊的指针类型,可以和其他类型一样被保存在变量中。通过函数标识符和变量都可以访问到该函数,演示如下:

func funcTest() {
  fmt.Println("func() type")
}
func main() {
  fmt.Printf("%T, (%v)\n", funcTest, funcTest)
  fn := funcTest
  fmt.Printf("%T, (%v)\n", fn, fn)
  funcTest()
  fn()
}
登录后复制

执行结果:

func(), (0x48fe20)
func(), (0x48fe20)
func() type
func() type
登录后复制

可见,函数标识符就是指向函数的指针。可以赋值给其他变量。

函数参数

函数也可以作为其他函数的参数来使用,演示如下:

func funcSuccess() {
}
func funcAsync(handle func()) {
  // 调用函数参数
  handle()
}
// 传递函数到其他函数
funcAsync(success)
登录后复制

这种回调函数的使用语法,在处理异步逻辑时十分有用。

匿名函数

可以定义匿名函数。可以将匿名函数保存到变量中,作为参数传递,或者立即调用。如果函数时临时使用函数,则匿名函数是一个好选择。示例语法:

赋值给变量
fn := func() {
}
fn()

// 作为参数
someFunc(func() {
  })

// 立即调用
func() {
  }()
登录后复制

闭包

由于匿名函数可以定义在其他函数内,同时变量的作用域为层叠的,也就是匿名函数可以会访问其所在的外层函数内的局部变量。当外层函数运行结束后,匿名函数会与其使用的外部函数的局部变量形成闭包。示例代码:

var fn func()
func outer() {
  v := 42
  fn = func() {
    v ++
    fmt.Print(v)
  }
}

outer()
fn() // 43
登录后复制

此例中,fn 对应的匿名函数与 outer() 的局部变量 v,就形成了闭包。

函数调用示意图

var v = "global"
func funcTest(v) {
  v = "funcTest"
  fmt.Println(v)
}
func main() {
  v := "main"
  funcTest(v)
}
登录后复制

代码编译期间,会将函数代码存放在内存代码区。 函数被调用时,在运行期间会在函数运行栈区开辟函数栈,内部由局部变量标识符列表(就是局部变量),上层标识符列表引用等信息。直到运行结束,此空间才会被出栈,释放。 函数内部调用了新函数,新函数的执行空间入栈,要等到新函数执行空间出栈,调用他的函数才会被出栈。 以上代码的运行逻辑图如下:

1.png

递归调用

函数内部调用函数本身。称之为递归调用。示例代码:

func funcTest() {
  fmt.Println("run")
  funcTest()
}
登录后复制

定义实现递归调用函数时,通常需要定义一个出口。用来确定何时不再进行递归调用了。一旦满足条件,则调用停止。例如:

func funcTest(v) {
  fmt.Println(v, "run")
  v ++
  if v <= 10 {
    funcTest()
  }
}
登录后复制

典型的应用有,树状菜单的处理,遍历目录,快速排序等。 递归调用的优势是编码简单,与描述的业务逻辑保持一致。

【相关推荐:Go视频教程

以上是go语言中函数是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中`var`和`type`关键字定义结构体的区别是什么? Go语言中`var`和`type`关键字定义结构体的区别是什么? Apr 02, 2025 pm 12:57 PM

Go语言中结构体定义的两种方式:var与type关键字的差异Go语言在定义结构体时,经常会看到两种不同的写法:一�...

Go语言中哪些库是由大公司开发或知名的开源项目提供的? Go语言中哪些库是由大公司开发或知名的开源项目提供的? Apr 02, 2025 pm 04:12 PM

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...

在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? 在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? Apr 02, 2025 pm 02:03 PM

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

GoLand中自定义结构体标签不显示怎么办? GoLand中自定义结构体标签不显示怎么办? Apr 02, 2025 pm 05:09 PM

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

VSCode中如何解决Golang泛型函数类型约束被自动删除的问题? VSCode中如何解决Golang泛型函数类型约束被自动删除的问题? Apr 02, 2025 pm 02:15 PM

VSCode中Golang泛型函数类型约束的自动删除问题在使用VSCode编写Golang代码时,用户可能会遇到一个奇怪的问题。当...

See all articles