go语言是编译型语言,所以函数的编写顺序是无关紧要的,为了可读性建议把main()函数写在文件的前面,其它函数按照被调用顺序编写
1、普通函数的定义
func 函数名(参数)(返回值){
函数体
}
- 函数:由字母、数字、下划线组成,在同一个包内函数名不能重名
- 参数:局部变量,值由函数调用者提供,多个参数用逗号隔开
- 返回值由返回值变量和变量类型组成,也可以只写返回值类型,多个返回值必须用括号包裹并使用逗号分隔,如果没有返回值括号可以省略
func intSum(x int, y int) int {
return x + y
}
fmt.Println(intSum(3,2))
代码说明:
- 3和2是调用时传入的实数,函数返回一个int类型的值,返回值也可以被命名
- 如果一个函数包含返回值,那么函数必须以return语句结尾,除非函数明显无法运行到结尾处
- 函数在调用时必须按照形参声明顺序提供实参,go语言中形参和返回值的变量名对于函数调用者而言没有意义
- 函数中实参通过值传递方式进行传递,函数的形参是实参的拷贝,对形参进行修改不会影响实参。
- 如果实参是引用类型,如指针、切片、map等实参可能会由于函数的间接引用而改变
2、函数参数
2.1、类型简写
函数的参数中如果相邻变量的类型相同,则可以省略类型
func intSum(x, y int) int {
return x + y
}
2.2、可变参数
- 可变参数指函数的参数数量不固定,可变参数通过在参数名后加…来标识
- 可变参数是作为函数的最后一个参数
- 本质上函数的可变参数是通过切片来实现的
func intSum2(x...int) int {
fmt.Println(x) //x是可变参数,切片类型
sum := 0
for _, v := range x { //遍历x的值
sum = sum + v
}
return sum
}
ret1 := intSum2()
ret2 := intSum2(10)
ret3 := intSum2(10, 20)
ret4 := intSum2(10, 20, 30)
fmt.Println(ret4)
[10 20 30]
60
- 固定参数搭配可变参数使用时,可变参数要放在固定参数的后面
func intSum3(x int, y ...int) int {
fmt.Println(x, y)
sum := x // 将x赋值给sum
for _, v := range y { // 遍历切片y的值
sum = sum + v
}
return sum
}
ret7 := intSum3(100, 10, 20)
ret8 := intSum3(100, 10, 20, 30)
fmt.Println(ret8)
100 [10 20 30]
160
3、函数返回值
通过return向外输出返回值
3.1、多返回值
函数如果有多个返回值必须用()将所有返回值包裹起来
func calc(x, y int) (int, int) {
sum := x + y
sub := x - y
return sum, sub
}
3.2、返回值命名
- 函数定义时可以给返回值命名,并在函数体中直接使用,就使用return返回
- 命名的返回值变量的默认值为类型的默认值,即数值为 0,字符串为空字符串,布尔为 false、指针为 nil 等
func calc(x, y int) (sum, sub int) {
sum = x + y
sub = x - y
return
}
func someFunc(x string) []int { //返回值类型为切片
if x == "" {
return nil // nil可以是一个有效的返回
}
...
}