06.函数

news/2024/10/5 20:54:49/文章来源:https://www.cnblogs.com/JJJHaoran/p/18288156

Go 语言中的函数是代码组织和复用的基础,函数的定义和调用非常简单明了。下面是 Go 语言中函数的基础语法和一些关键概念:

函数的定义

在 Go 语言中,函数的定义包括函数名、参数列表、返回值类型和函数体。语法格式如下:

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

 

示例

下面是一个简单的函数示例,该函数接收两个整数参数并返回它们的和:

package mainimport "fmt"// 定义一个函数 add,接收两个整数参数 a 和 b,返回它们的和
func add(a int, b int) int {return a + b
}func main() {// 调用 add 函数,并将返回值赋给 sumsum := add(3, 4)fmt.Println("3 + 4 =", sum) // 输出:3 + 4 = 7
}

 

参数和返回值

  • 多个参数:如果参数列表中有多个参数,它们之间用逗号分隔。如果多个参数的类型相同,可以省略重复的类型声明:

    func add(a, b int) int {return a + b
    }

     

  • 多个返回值:Go 语言支持函数返回多个值:

    func swap(x, y string) (string, string) {return y, x
    }func main() {a, b := swap("hello", "world")fmt.Println(a, b) // 输出:world hello
    }

     

命名返回值

函数的返回值可以命名,这样可以在函数体中直接使用这些变量,并在函数末尾使用 return 语句返回:

func split(sum int) (x, y int) {x = sum * 4 / 9y = sum - xreturn
}func main() {a, b := split(17)fmt.Println(a, b) // 输出:7 10
}

 

空白标识符 _

如果函数返回多个值,但你不需要使用其中的某些值,可以使用空白标识符 _ 忽略它们:

func foo() (int, int, int) {return 1, 2, 3
}func main() {a, _, c := foo()fmt.Println(a, c) // 输出:1 3
}

 

可变参数

Go 语言支持可变参数函数,即函数参数的个数可以是可变的。语法是使用省略号 ... 表示可变参数:

func sum(numbers ...int) int {total := 0for _, number := range numbers {total += number}return total
}func main() {fmt.Println(sum(1, 2, 3))    // 输出:6fmt.Println(sum(1, 2, 3, 4)) // 输出:10
}

 

小结

  • 函数是 Go 语言中代码复用的基本单位。
  • 函数可以有多个参数和返回值。
  • 函数参数和返回值可以命名,增加代码的可读性。
  • 可变参数函数可以接收任意数量的参数。

通过理解这些基本语法,可以在 Go 语言中更有效地定义和使用函数。

课程案例

实现加减乘除

package mainimport "fmt"func eval(a, b int, op string) int {switch op {case "+":return a + bcase "-":return a - bcase "*":return a * bcase "/":return a / bdefault:panic("unsupported operation" + op)}
}
func main() {fmt.Println(eval(1, 2, "+"))
}

运行结果:

 取余操作

func div(a, b int) (int, int) {return a / b, a % b
}
func main() {fmt.Println(div(10, 2))fmt.Println(div(10, 3))
}

 写法二:

package mainimport "fmt"func div(a, b int) (quotient, remainder int) {return a / b, a % b
}
func main() {quotient, remainder := div(10, 3)fmt.Println(quotient, remainder)
}

两个返回值只想要一个的情况:

    case "/":quotient, _ := div(a, b)return quotient

处理非法制报错操作

package mainimport "fmt"func eval(a, b int, op string) (int, error) {switch op {case "+":return a + b, nil
    case "-":return a - b, nilcase "*":return a * b, nilcase "/":quotient, _ := div(a, b)return quotient, nildefault://会中断执行//panic("unsupported operation" + op)return 0, fmt.Errorf("unsupported operation: %s", op)}
}
func div(a, b int) (quotient, remainder int) {return a / b, a % b
}
func main() {
  if result, err := eval(1, 2, "x"); err != nil {
  fmt.Println("Error:", err)
  } else {
    fmt.Println(result)
  }
}

运行结果:

 

nil 是一个预定义的标识符,表示函数调用成功且没有错误发生。具体来说,nilerror 类型的零值,表示没有错误。让我们详细解释一下 nil 在你的代码中的作用。

nileval 函数中的作用

定义了一个名为 eval 的函数,这个函数接受两个整数 ab 以及一个字符串 op(表示操作符),然后根据操作符执行相应的算术运算。函数返回一个整数结果和一个 error 类型的值。

在这个函数中:

  1. return a + b, nil 等等:

    • 当操作符是 "+""-""*""/" 时,函数返回计算结果和 nil。这里的 nil 表示没有错误发生。例如,return a + b, nil 意味着加法操作成功,没有错误。
  2. return 0, fmt.Errorf("unsupported operation: %s", op):

    • 如果操作符不在支持的范围内(即既不是 "+""-""*" 也不是 "/"),函数返回 0 和一个 error 类型的值,表示发生了不支持的操作错误。fmt.Errorf 创建一个带有格式化字符串的 error 对象。

nil 的意义

在 Go 语言中,函数通常使用返回值 error 来表示函数是否成功执行。如果 error 返回 nil,则表示函数成功执行,没有发生错误。如果 error 返回非 nil 的值,则表示函数执行过程中发生了错误。通过这种方式,Go 语言避免了使用异常处理错误。

运算方法重写案例

package mainimport ("fmt""math""reflect""runtime"
)func apply(op func(int, int) int, a, b int) int {p := reflect.ValueOf(op).Pointer()opName := runtime.FuncForPC(p).Name()fmt.Printf("Calling function %s with arguments"+"(%d, %d)\n", opName, a, b)return op(a, b)
}
func pow(a, b int) int {return int(math.Pow(float64(a), float64(b)))
}func main() {fmt.Println(apply(pow, 3, 4))
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一周学习总结

暑假第一周,经过短暂的调整,我进入到了Java语言的学习中。通过这一周的学习,在《疯狂Java讲义》与B站黑马程序员课程的帮助下,我初步了解了Java这门编程语言。以下是我对这周学习的总结: 1.学习使用CMD 学会了使用Win+R输入cmd打开CMD窗口,学习了一些常见CMD指令(如dir,…

Aide插件

aide/docs/configuration/README_CN.md at master nicepkg/aide GitHub VSCode代码阅读神器正式发布_哔哩哔哩_bilibili 结合chatgpt实现多种功能,包含代码一键生成逐行翻译、多种编程语言之间的转换等功能,对于接手大型工程的朋友们比较友善。 在安装、运行的过程中自己遇…

如何返回“无法访问此网站,网页可能暂时无法连接,或者它已经永久性地移动到了新网址”

测试网址:https://apd-vlive.apdcdn.tc.qq.com/vhqts.tc.qq.com/AH06mhzdlI9B9pSNWNcCQ3qMPITV0Kvp7M9y38FV4acs/B_tRCdt2L6hl1ezG-aht1_p5_cq9aDE5woqbhlSZqo2k-426BaS8_TYPecOQIueTdj/svp_50112/KVzxIc_QsMTArbayBuac_YlujjBVGNK2tuYZLHLdMFhy2_PHwGTGHd8PTpwBeJf4V8Ol2Ejdk…

05.循环

for循环for 的条件里不需要括号 for 的条件里可以省略初始条件,结束条件,递增表达式将整数转换为字符串:package mainimport ("fmt""strconv" )func convertToBin(n int) string {//将整数转换为二进制result := ""for ; n > 0; n /= 2 {l…

使用 Kotlin 语言开发 NeoForge 模组

前言 Kotlin 是由 JetBrains 推出的一门基于 JVM 平台的编程语言,引入了许多不同于 Java 的先进概念以及语法糖,极大地提高了开发人员的编程效率,广受各路 Java 开发者推崇。但由于 NeoForge 官方并未就使用 Kotlin 开发模组提供支持,使得精通 Kotlin 的开发者未能使用所擅…

华为od面经(C++)

华为od面经(C++) 流程 5.20 机试 5.21 性格测试(从性格测试到HR面隔了一个月,期间在准备技术面) 6.20 HR面试 6.25 上午11:00 技术一面 6.25 下午6:00 技术二面 6.27 主管面 机考 100分:剩余银饰的重量,字符串序列判定,200分:数组排列求和。前两道题很简单,当时数组排…

算法金 | 一个强大的算法模型,GPR !!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」抱个拳,送个礼 高斯过程回归(GPR)是一种非参数化的贝叶斯方法,用于解决回归问题。与传统的线性回归模型不同,GPR 能够通过指定的核函数捕捉复杂的非线性关系,并提…

[SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解

题目链接:CF 或者 洛谷 PS: CF的得等上gym。 前提说明 其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。 讲解 其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里…

[Redis]持久化

持久化 Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。 Redis的持久化机制有两种,第一种是快照,第二种是AOF日志。 快照是一次全量备份,AOF日志是连续的增量备份。 快…

Body SectionedSolidHorizontal

Body SectionedSolidHorizontal Body SectionedSolidHorizontal是通过使用两个或多个闭合轮廓(可能具有不同的尺寸)来表示产品的三维实体,这些轮廓沿准线在指定位置之间扫掠。应使用保持该几何表示的IfcShapeResentation的以下属性值:IfcShapeRepresentation.Representatio…