函数是基本的代码块,用于执行一个任务。
Go 语言最少有个 main() 函数。
你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。
函数声明告诉了编译器函数的名称,返回类型,和参数。
Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。
# 函数定义
func function_name(input1 type1, input2 type2) (type1, type2) {
// 函数体
// 返回多个值
return value1, value2
}
函数用 func 声明。
函数可以有一个或多个参数,需要有参数类型,多个参数时用逗号分割
函数可以有一个或多个返回值,有多个返回值时其返回类型需用逗号分割
函数的参数是可选的,返回值也是可选的。
# 值传递
传递参数时,将参数复制一份传递到函数中,对参数进行调整后,不影响参数值。
// 编写一个md5函数
package main
import (
"crypto/md5"
"fmt"
)
func main() {
str := "12345"
fmt.Printf("MD5(%s): %s\n", str, MD5(str))
}
// 形参名str,形参类型string,返回值类型string
func MD5(str string) string {
// fmt.Sprintf 用来格式化字符串,%x表示十六进制
data := []byte(str)
s1 := fmt.Sprintf("%x", md5.Sum(data))
return s1
}
运行结果:
C:\Go\www>go run dengyu.go
MD5(12345): 827ccb0eea8a706c4c34a16891f84e7b
Go 语言默认是值传递
# 引用传递
传递参数时,将参数的地址传递到函数中,对参数进行调整后,影响参数值。
package main
import ("fmt")
type Result struct {
Code int
Message string
}
func main() {
var res Result
res.Code = 200
res.Message = "成功"
fmt.Println("修改前的结构体:", res)
setData(&res)
fmt.Println("修改后的结构体:", res)
}
func setData(r *Result) {
r.Code=400
r.Message="失败"
}
运行结果:
C:\Go\www>go run dengyu.go
修改前的结构体: {200 成功}
修改后的结构体: {400 失败}
(完)
(完)