1、什么是参数
什么是参数,函数为什么需要参数呢?我如果要动态的传入一些值进入到函数,如何实现呐?这就涉及到了函数的参数。
比如我们讲计算 1-100的和通过函数实现了,但是完成新的需求:
分别计算并在终端打印 1-100的和,1-150的和以及1-200的和。
package main
import "fmt"
func cal_sum100() {
// 计算1-100的和
var s = 0
for i := 1; i <= 100; i++ {
s += i
}
fmt.Println(s)
}
func cal_sum150() {
// 计算1-100的和
var s = 0
for i := 1; i <= 150; i++ {
s += i
}
fmt.Println(s)
}
func cal_sum200() {
// 计算1-100的和
var s = 0
for i := 1; i <= 200; i++ {
s += i
}
fmt.Println(s)
}
func main() {
cal_sum100()
cal_sum150()
cal_sum200()
}
这样当然可以实现,但是是不是依然有大量重复代码,一会发现三个函数除了一个变量值不同以外其他都是相同的,所以为了能够在函数调用的时候动态传入一些值给函数,就有了参数的概念。
参数从位置上区分为形式参数和实际参数。
func 函数名(形式参数1 参数1类型, 形式参数2 参数2类型,...){
函数体
}
// 调用函数
函数名(实际参数1,实际参数2,...)
函数每次调用可以传入不同的实际参数,传参的过程其实就是变量赋值的过程,将实际参数按位置分别赋值给形参。
还是刚才的案例,用参数实现 :
package main
import "fmt"
func cal_sum(n int) {
// 计算1-100的和
var s = 0
for i := 1; i <= n; i++ {
s += i
}
fmt.Println(s)
}
func main() {
cal_sum(100)
cal_sum(101)
cal_sum(200)
}
这样是不是就灵活多了,所以基本上一个功能强大的函数都会有自己的需要的参数,让整个业务实现更加灵活。
2、位置参数
位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。
package main
import "fmt"
// 函数声明 两个形参:x, y
func add_cal(x, y int) {
fmt.Println(x + y)
}
func main() {
// 函数调用,按顺序传参
//add_cal(1) //报错
//add_cal(1, 2, 3) //报错
add_cal(1, 2)
}
3、不定长参数
如果想要一个函数能接收任意多个参数,或者这个函数的参数个数你无法确认,就可以使用不定长参数,也叫可变长参数。Go语言中的可变参数通过在参数后面加 … 来标识
package main
import "fmt"
func sum(nums ...int) { //接收不定长参数
fmt.Println(nums)
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
}
func main() {
sum(23, 45) // [23 45] 68
sum(1, 2, 3, 4, 5) // [1 2 3 4 5] 15
}
注意:可变参数通常要作为函数的最后一个参数。
package main
import "fmt"
func sum(base int, nums ...int) {
fmt.Println(nums)
total := base
for _, num := range nums {
total += num
}
fmt.Println(total)
}
func main() {
sum(23, 45)
sum(1, 2, 3, 4, 5)
}