首页 > 其他分享 >Go 快速入门指南 - 函数

Go 快速入门指南 - 函数

时间:2022-12-24 18:35:52浏览次数:44  
标签:指南 入门 int fmt go func Go 返回值 main

概述

​函数​​ 是将一个或者一类问题包装为一个代码块,可以被多次调用,提高代码重用性。

Go 函数中声明、定义、参数、返回值这些基础概念,和其他编程语言中的一致,这里不再赘述。

语法规则

Go 函数支持单个返回值和多个返回值。

# 单个返回值
# 参数可省略
func 函数名称(参数 1 值 参数 1 类型, 参数 2 值 参数 2 类型 ...) 返回值类型 {
// do something
}

# 多个返回值,不指定名称
# 参数可省略
func 函数名称(参数 1 值 参数 1 类型, 参数 2 值 参数 2 类型 ...) (返回值 1 类型, 返回值 2 类型) {
// do something
}

# 多个返回值,指定名称
# 参数可省略
func 函数名称(参数 1 值 参数 1 类型, 参数 2 值 参数 2 类型 ...) (返回值 1 名称 返回值 1 类型, 返回值 2 名称 返回值 2 类型) {
// do something
}

例子

单个返回值

package main

import "fmt"

func max(x, y int) int {
if x > y {
return x
} else {
return y
}
}

func main() {
fmt.Printf("max = %d\n", max(1, 2))
}

// $ go run main.go
// 输出如下
/**
max = 2
*/

多个返回值,不指定名称

package main

import "fmt"

func getNumbers() (int, int, int) {
return 1, 2, 3
}

func main() {
x, y, z := getNumbers()
fmt.Printf("x = %d, y = %d, z = %d\n", x, y, z)
}

// $ go run main.go
// 输出如下
/**
x = 1, y = 2, z = 3
*/

多个返回值,指定名称

package main

import "fmt"

func getNumbers() (x int, y float64, z string) {
x = 1024
y = 3.14
z = "hello world"
return
}

func main() {
x, y, z := getNumbers()
fmt.Printf("x = %d, y = %.2f, z = %s\n", x, y, z)
}

// $ go run main.go
// 输出如下
/**
x = 1024, y = 3.14, z = hello world
*/

参数/返回值 类型相同简化

  • • 当参数类型相同时,可以将类型放在最后一个参数变量后面
  • • 当返回值类型相同时,可以将类型放在最后一个返回值变量后面
package mainimport "fmt"func getMaxAndMin(x, y, z int) (max, min int) {    if x > y {        max = x        min = y        if x < z {            max = z        } else if z < y {            min = z        }    } else {        max = y        min = x        if y < z {            max = z        } else if z < x {            min = x        }    }    return}func main() {    max, min := getMaxAndMin(100, 200, 300)    fmt.Printf("max = %d, min = %d\n", max, min)}// $ go run main.go// 输出如下 /**  max = 300, min = 100
*/

递归函数

经典语录: 要想理解递归,首先要理解递归。

例子

阶乘

package main

import "fmt"

func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}

func main() {
fmt.Printf("1 * 2 * 3 * 4 * 5 = %d\n", factorial(5))
}

// $ go run main.go
// 输出如下
/**
1 * 2 * 3 * 4 * 5 = 120
*/

闭包函数

闭包的概念参考扩展阅读-3。

例子

自增序列号生成器

package main

import "fmt"

// 自增序列号生成器
func incSeq() func() int {
i := 0
return func() int {
i++
return i
}
}

func main() {
next := incSeq()

fmt.Printf("初始值 = %d\n", next())

for i := 1; i <= 5; i++ {
fmt.Printf("第 %d 次迭代后, 值 = %d\n", i, next())
}
}

// $ go run main.go
// 输出如下
/**
初始值 = 1
第 1 次迭代后, 值 = 2
第 2 次迭代后, 值 = 3
第 3 次迭代后, 值 = 4
第 4 次迭代后, 值 = 5
第 5 次迭代后, 值 = 6
*/

内部函数

使用的场景:在函数内部有很多重复性代码并且严重依赖上下文变量。此时可以在函数内部声明一个函数,专门用来处理重复性的代码。

例子

内部求和函数

package main

import "fmt"

func main() {
var sum func(...int) int // 声明 sum 函数

sum = func(numbers ...int) int { // 定义 sum 函数
total := 0
for _, num := range numbers {
total += num
}
return total
}

fmt.Printf("1 + 2 + 3 = %d\n", sum(1, 2, 3))
}

// $ go run main.go
// 输出如下
/**
1 + 2 + 3 = 6
*/

扩展阅读

  1. 1. 函数 - 维基百科 (https://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E5%8E%9F%E5%9E%8B)
  2. 2. 递归 - 维基百科 (https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92)
  3. 3. 闭包 - 维基百科 (https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6))

Go 快速入门指南 - 函数_Go

标签:指南,入门,int,fmt,go,func,Go,返回值,main
From: https://blog.51cto.com/u_15915979/5967434

相关文章

  • Go 快速入门指南 - init 函数
    概述​​init()函数​​ 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一......
  • Go 快速入门指南 - 接口和方法
    接口Go接口是隐式实现。 对于一个数据类型,无需声明它实现了哪些接口,只需要实现接口必需的方法即可。当然了,存在一个小问题就是:我们可能无意间实现了某个接口:),所以 ​......
  • Go 快速入门指南 - 判断是否实现接口
    判断是否实现接口Go里面没有 ​​implements​​ 关键字来判断一个结构体(对象)是否实现了某个接口, 要实现类似的功能,需要用到 ​​类型断言​​。类型断言//判断......
  • Go 快速入门指南 - 零值和错误
    零值当一个变量使用 ​​var​​​ 进行声明后并未进行初始化(变量后面没有赋值符 ​​=​​)操作,会默认分配一个零值(zerovalue)。不同类型对应的零值类型零值boolf......
  • Go 快速入门指南 - 类型比较
    概述​​比较运算符​​​ 用来比较两个操作数并返回一个 ​​bool​​ 值,常见的比较运算符:==等于!=不等于<小于<=小于等于>大于>=大于等于......
  • Go 快速入门指南 - goroutine
    概述goroutine是Go程序并发执行的实体,对于初学者来讲,可以简单地将 ​​goroutine​​​ 理解为一个 ​​超轻量的线程​​。当一个程序启动时,只有一个goroutine调用......
  • Go 快速入门指南 - 缓冲通道和非缓冲通道
    概述建议先阅读 goroutine 小节。Go箴言:不要通过共享内存来通信,而要通过通信来共享内存。​​goroutine​​​ 是Go程序并发执行的实体,​​channel(通道)​​​ ......
  • Go 快速入门指南 - 通道方向和关闭通道
    概述建议先阅读 阻塞通道 和 非阻塞通道 小节。在前面的两个小节中,为了最小化代码达到演示效果,省略了 ​​关闭通道​​ 的步骤,正确的做法应该是在通道使用完成后关......
  • Go 快速入门指南 - 遍历通道
    概述建议先阅读 range, 阻塞通道, 非阻塞通道 等小节。​​range​​ 除了可以遍历字符串、切片、数组等数据结构外,还可以遍历通道。语法规则和遍历其他数据结构不同,遍......
  • Go 快速入门指南 - 互斥锁和定时器
    互斥锁对于任一共享资源,同一时间保证只有一个操作者,这种方法称为 ​​互斥机制​​。关键字 ​​Mutex​​​ 表示互斥锁类型,它的 ​​Lock​​​ 方法用于获取锁,​​U......