1 Go函数定义

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

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

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

函数对用户隐藏了细节。

Golang函数特点:

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

Go函数基本语法:

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

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

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

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

1.1. 函数实战

package main

import "fmt"

//最普通的函数,无参数,无返回值
func sayHello() {
fmt.Printf("hello world\n")
} //求和函数add
func add(a, b, c int) int {
//sum := a + b + c
//return sum
return a + b
} //接收2个参数a 和b都是int类型
//返回2个参数,sum和sub作为返回值,也叫做对返回值命名
func calc(a, b int) (sum int, sub int) {
sum = a + b
sub = a - b
return
} //接收不定长参数个数,
//参数名是b,类型是不固定个数的int类型
//变量b此时是一个slice切片,数据类型:[]int,可以通过索引取值
func calc_v1(b ...int) int {
sum := 0
for i := 0; i < len(b); i++ {
sum = sum + b[i]
}
return sum
} func main() {
//调用函数
sayHello()
//打印返回值求和结果
fmt.Println(add(5, 5, 5)) //多个返回值
sum1, sub1 := calc(5, 10)
fmt.Printf("calc计算和是%d\n", sum1)
fmt.Printf("calc计算差是%d\n", sub1) //传入不固定长度的参数个数
sum := calc_v1(10, 20, 30, 40)
fmt.Println(sum) }

1.2. Go函数注意事项

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

package main

import "fmt"

func modify(n int) {
n = n + 100
fmt.Println("modify函数修改后n=", n)
} func main() {
num := 10
modify(num)
fmt.Println("此时main主程中的nun值=", num)
}

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

package main

import "fmt"

//指针变量,接收一个地址
func modify2(n *int) {
*n = *n + 100
fmt.Println("modify2修改后n的值=", *n)
} func main() {
num2 := 10
modify2(&num2)
fmt.Println("此时main主程中的num2值=", num2)
}

1.3. init函数

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

package main

import "fmt"

func init() {
fmt.Println("init函数一般完成初始化工作,如数据库驱动连接等")
} func main() {
fmt.Println("我是主程序")
}

1.4. init函数细节

go程序加载流程:

全局变量

init函数

main函数
package main

import "fmt"

//全局变量
var num = test() func test() int {
fmt.Println("执行了test()函数")
return 999
} func init() {
fmt.Println("执行了init函数")
} func main() {
fmt.Println("我是主程序")
fmt.Println(num)
}

面试题:

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

main.go是程序入口

自上而下,进入import导入

优先进入utils.go 加载全局变量 这是第一步

执行utils.go的init函数 第二步

完毕后,回到main.go的全局变量 第三步

执行main.go的init函数 第四步

执行main.go的主程main()函数 第五步

最新文章

  1. SQLAlchemy ORM高级查询之过滤,排序
  2. Reveal使用步骤和 破解Revealapp的试用时间限制
  3. OC语言-02-OC语言-基础知识
  4. 在AE中通过指定中心点和半径画圆
  5. 【Xamarin挖墙脚系列:IOS-关于手机支持的屏幕方向】
  6. ibatis面试笔记
  7. C# mvc 验证码3
  8. hbase 架构
  9. Dao 处理
  10. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)
  11. hdu 4771 Stealing Harry Potter&amp;#39;s Precious(bfs)
  12. 浅谈JavaScript中继承的实现
  13. sql存储过程中使用 output
  14. .NET Core使用swagger进行API接口文档管理
  15. Python爬取指定重量的快递价格
  16. Java是值传递还是引用传递?
  17. LCT模板(无讲解)
  18. 运维yum搭建zabbix
  19. linux 解决乱码问题
  20. VC使一个对话框不显示

热门文章

  1. [Inno Setup] 对比字符串
  2. 用百度AI平台接口实现OCR文字识别
  3. 构建密钥验证ssh
  4. Kubernetes-在Kubernetes集群上搭建HBase集群
  5. JS基础入门篇(十)— 数组方法
  6. angularJS中$http.get( ).success( )报错原因及解决方案
  7. 图论--拓扑排序--判断是否为DAG图
  8. 第十届山东省赛L题Median(floyd传递闭包)+ poj1975 (昨晚的课程总结错了,什么就出度出度,那应该是叫讨论一个元素与其余的关系)
  9. Java——单双引号的区别
  10. springboot配置静态资源访问路径