一、函数的声明
go函数的声明格式:
func 函数名(输入参数列表) (返回参数列表) {
函数体
}
格式1:
func add1(a int, b int) (a1 int, b1 int) {
return a + 1, b + 1
}
格式2:相邻的参数类型一样时可以简写
func add1(a, b int) (a1, b1 int) {
return a + 1, b + 1
}
格式3:返回值有变量名时可以用如下格式
func add1(a, b int) (a1, b1 int) {
a1, b1 = a+1, b+1
return
}
格式4:返回值可以没有名称如下格式
func add1(a, b int) (int, int) {
return a + 1, b + 1
}
格式5:无输入参数、输出参数 如main函数
func main() {
println("hello world!!!")
}
二、函数调用
package main
func main() {
// 定义变量x,y 接受函数的返回值
x, y := add1(3, 6)
println(x, y)
// 直接打印函数返回值
println(add1(5, 7))
// 只使用一个返回值时需要使用_占位
u, _ := add1(7, 8)
println(u)
}
func add1(a, b int) (int, int) {
return a + 1, b + 1
}
三、传值与传址
简化上面的加1函数不使用返回值,期望为a、b执行加1操作代码如下,结果打印不符合预期
package main
func main() {
a, b := 3, 6
add1(a, b) // 调用加1函数为a,b加1
println(a, b) // 打印 3,6
}
func add1(a, b int) {
a += 1
b += 1
}
修改加1函数的入参为指针类型后打印结果符合预期
package main
func main() {
a, b := 3, 6
add1(&a, &b) // 输入a,b的地址调用加1函数为 a,b加 1
println(a, b) // 打印 4,7
}
// 接受参数为int的指针
func add1(a, b *int) {
*a += 1
*b += 1
}
查看参数的地址
package main
func main() {
a, b := 3, 6
x, y := &a, &b
println(&a, &b)// 打印a,b的地址
println(&x, &y)// 打印入参x,y的地址
add1(x, y)
}
func add1(a, b *int) {
println(a, b)// 打印入参的值
println(&a, &b)// 打印入参的地址
}
四、匿名函数
匿名函数1:函数赋值给变量
package main
func main() {
slice := []string{"go", "golang", "vue", "rust"}
// 定义一个匿名函数
f := func(s string) {
println(s)
}
for _, v := range slice {
// 调用匿名函数
f(v)
}
}
匿名函数2:声明并直接调用
package main
func main() {
slice := []string{"go", "golang", "vue", "rust"}
func(s []string) {
for i, v := range s {
println(i, v)
}
}(slice)//(slice) 调用匿名函数
}
匿名函数3:函数作为回调函数,作为其他函数的入参
package main
func main() {
slice := []string{"go", "golang", "vue", "rust"}
// 调用myPrint函数,定义匿名函数作为入参func(v string) {println(v) }
myPrint(slice, func(v string) {
println(v)
})
}
// myPrint函数需要一个函数作为入参
func myPrint(s []string, f func(v string)) {
for _, v := range s {
// 调用匿名函数
f(v)
}
}
匿名函数4:函数作为其他函数的返回值
package main
import (
"strconv"
)
func main() {
slice := []string{"go", "golang", "vue", "rust"}
i := 0
for _, v := range slice {
myPrint(v)(i) // (i)执行函数myPrint(v)返回的函数
i += 1
}
}
// myPrint函数返回值是一个函数
func myPrint(s string) func(int) {
pre := "编程语言_"
return func(l int) {
println(pre + strconv.Itoa(l) + "_" + s)
}
}