当前位置:   article > 正文

5.1 Go函数定义

go5.1

1 Go函数定义

Go函数是指:一段具有独立功能的代码,然后可以在程序中其他地方多次调用。

Go分为自定义函数,系统函数。

函数可以将一个大的工作拆解成小的任务。

函数对用户隐藏了细节。

Golang函数特点:

  1. 支持不定长参数
  2. 支持多返回值
  3. 支持命名返回参数
  4. 支持匿名函数、闭包
  5. 函数也是类型,可以赋值给变量
  6. 一个package下不得有两个同名函数,不支持函数重载
  7. 函数参数可以没有,或者多个参数
  8. 注意类型在变量名后面
  9. 多个连续的函数命名参数是同一类型,除了最后一个类型,其余可以省略
  10. 函数可以返回任意数量的返回值
  11. 函数体中,形参作为局部变量
  12. 函数返回值可以用 _标识符进行忽略
  13. main()函数由编译器调用,其他函数手动调用

Go函数基本语法:

1)形参:函数的输入参数

2)执行代码:实现函数功能的代码块

3)函数的返回值可有可无

  1. func 函数名(形参列表)(返回值列表){
  2. 执行代码
  3. return 返回值列表
  4. }
  5. func test(x, y int, z string) (int, string) {
  6. //类型相同的相邻参数x,y参数类型可以合并
  7. //多返回值得用括号括起来
  8. n := x + y
  9. return n, z
  10. }

1.1. 函数实战

  1. package main
  2. import "fmt"
  3. //最普通的函数,无参数,无返回值
  4. func sayHello() {
  5. fmt.Printf("hello world\n")
  6. }
  7. //求和函数add
  8. func add(a, b, c int) int {
  9. //sum := a + b + c
  10. //return sum
  11. return a + b
  12. }
  13. //接收2个参数a 和b都是int类型
  14. //返回2个参数,sum和sub作为返回值,也叫做对返回值命名
  15. func calc(a, b int) (sum int, sub int) {
  16. sum = a + b
  17. sub = a - b
  18. return
  19. }
  20. //接收不定长参数个数,
  21. //参数名是b,类型是不固定个数的int类型
  22. //变量b此时是一个slice切片,数据类型:[]int,可以通过索引取值
  23. func calc_v1(b ...int) int {
  24. sum := 0
  25. for i := 0; i < len(b); i++ {
  26. sum = sum + b[i]
  27. }
  28. return sum
  29. }
  30. func main() {
  31. //调用函数
  32. sayHello()
  33. //打印返回值求和结果
  34. fmt.Println(add(5, 5, 5))
  35. //多个返回值
  36. sum1, sub1 := calc(5, 10)
  37. fmt.Printf("calc计算和是%d\n", sum1)
  38. fmt.Printf("calc计算差是%d\n", sub1)
  39. //传入不固定长度的参数个数
  40. sum := calc_v1(10, 20, 30, 40)
  41. fmt.Println(sum)
  42. }

1.2. Go函数注意事项

1)基本数据类型和数组默认值传递,有一个值拷贝过程,不会修改原本变量的值

  1. package main
  2. import "fmt"
  3. func modify(n int) {
  4. n = n + 100
  5. fmt.Println("modify函数修改后n=", n)
  6. }
  7. func main() {
  8. num := 10
  9. modify(num)
  10. fmt.Println("此时main主程中的nun值=", num)
  11. }

2)如果希望函数可以修改函数外的变量,需要以指针传递,传入变量的地址,函数内以指针方式操作变量。

  1. package main
  2. import "fmt"
  3. //指针变量,接收一个地址
  4. func modify2(n *int) {
  5. *n = *n + 100
  6. fmt.Println("modify2修改后n的值=", *n)
  7. }
  8. func main() {
  9. num2 := 10
  10. modify2(&num2)
  11. fmt.Println("此时main主程中的num2值=", num2)
  12. }

1.3. init函数

每个源文件都会包含一个inti函数,该函数在main函数之前被执行。

  1. package main
  2. import "fmt"
  3. func init() {
  4. fmt.Println("init函数一般完成初始化工作,如数据库驱动连接等")
  5. }
  6. func main() {
  7. fmt.Println("我是主程序")
  8. }

1.4. init函数细节

go程序加载流程:

  1. 全局变量
  2. init函数
  3. main函数
  1. package main
  2. import "fmt"
  3. //全局变量
  4. var num = test()
  5. func test() int {
  6. fmt.Println("执行了test()函数")
  7. return 999
  8. }
  9. func init() {
  10. fmt.Println("执行了init函数")
  11. }
  12. func main() {
  13. fmt.Println("我是主程序")
  14. fmt.Println(num)
  15. }

面试题:

如果再包导入中,main.go和utils.go都有变量加载,init函数,执行流程是?

  1. main.go是程序入口
  2. 自上而下,进入import导入
  3. 优先进入utils.go 加载全局变量 这是第一步
  4. 执行utils.go的init函数 第二步
  5. 完毕后,回到main.go的全局变量 第三步
  6. 执行main.go的init函数 第四步
  7. 执行main.go的主程main()函数 第五步

转载于:https://www.cnblogs.com/open-yang/p/11256832.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/624850
推荐阅读
相关标签
  

闽ICP备14008679号