开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
函数声明
函数声明:一个函数名,参数列表,返回值列表和函数体。
如果函数没有返回值,则返回列表可以不写,函数可以没有参数或接受多个参数。
函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语句。
注意类型在变量名之后 eg: func test(x int)
当两个以上的函数命名参数是同一类型,只要在最后一个上写类型即可 eg: func test(x , y int)
函数可以返回任意数量的返回值。
使用关键字 func 定义函数,左大括号不能另起一行
func test(x, y int, s string) (int, string) {
// 类型相同的相邻参数,参数类型可合并。 多返回值必须用括号。
n := x + y
return n, s
}
注意:函数定义有返回值,就必须要有return,否则会出现编译错误。
当遇到没有函数体的函数声明,这表示该函数不是以Go实现的,是为了定义函数标识符。
func Sin(x float64) float
函数参数
- 函数定义的变量可称为该函数的形参,形参就像定义在函数体内的局部变量
- 调用函数传递过来的变量为实参,函数可以通过两种方式来传递参数:
- 值传递:调用函数时将实际参数拷贝一份传递到函数中,对参数修改不会影响实际参数的值
- 引用传递:调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
package main
import (
"fmt"
)
//值传递
func swap(x, y int) int {
... ...
}
//引用传递
func swap(x, y *int) {
var temp int
temp = *x
*x = *y
*y = temp
}
func main() {
var a, b int = 1, 2
swap(&a, &b)
fmt.Println(a, b)
}
一般情况下,函数都是使用值传递
- 无论是值传递,还是引用传递,传递给函数的都是变量的副本
- 值传递是值的拷贝,引用传递是地址的拷贝
- 地址拷贝更为高效,值拷贝取决于拷贝的对象大小,对象越大,则性能越低
- map、slice、chan、指针、interface默认以引用的方式传递。
在参数赋值时可以不用用一个一个的赋值,可以直接传递一个数组或者切片,特别注意的是在参数后加上…即可。
可变参数本质上就是 slice
func myfunc(args ...int) { //0个或多个参数
}
func add(a int, args…int) int { //1个或多个参数
}
返回值
可以使用"_"标识符,用来忽略函数的某个返回值
没有定义变量的 return 语句,可以使用函数返回定义中的参数,这种用法被称作裸返回。
package main
func test() (int, int) {
return 1, 2
}
func main() {
x, _ := test()
println(x)
}
总结
今天主要学习了Go的函数基础知识,函数的声明,参数的使用,返回值,,这都是后面需要反复复习的,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!