一、什么是函数
函数是入门简单精通难,函数是什么???
- 函数就是一段代码的集合
- go 语言中至少有一个 main 函数
- 函数需要有一个名字,独立定义的情况下,见名知意
- 函数可能需要有一个结果,也可能没有
函数和方法完全是不一样的东西,面向对象里面才有方法
二、函数的具体定义
在 go 语言中,函数是代码块的集合,用于执行特定任务或者计算。函数接受输入(成为参数),执行操作并返回输出(称为返回值)。go 语言中的函数定义非常简单且灵活。
2.1 函数的定义
在 go 语言中,函数通过 func 关键字定义。函数定义的基本格式如下:
func FunctionName(parameterList) returnType {
// Function body
}
func
:用于声明函数。FunctionName
:函数的名字,通常首字母大写表示公开(exported)函数,首字母小写表示私有(unexported)函数。parameterList
:参数列表(可选),参数使用name type
的格式。多个参数之间用逗号分隔。returnType
:返回值类型(可选)。如果函数没有返回值,则省略。
2.2 没有参数和返回值的函数
func SayHello() {
fmt.Println("Hello, World!")
}
在这个例子中:
SayHello
是函数的名称。- 函数没有任何参数。
- 函数没有返回值,只是打印了一句 "Hello, World!"。
2.3 带有参数的函数
func Add(a int, b int) int {
return a + b
}
a
和b
是函数的参数,它们都是int
类型。- 函数返回一个
int
类型的值,表示两个整数的和。
2.4 多个参数类型相同的函数
如果函数的多个参数类型相同,可以简化参数定义,只指定类型一次:
func Multiply(a, b int) int {
return a * b
}
在这个例子中,a
和 b
都是 int
类型,Go 会自动推断它们的类型。
2.5 带有多个返回值的函数
Go 语言支持多个返回值的函数。你可以定义一个函数返回多个值,通常用来返回计算结果和错误等信息:
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
在这个例子中:
Divide
函数接收两个int
类型的参数a
和b
。- 返回两个值,第一个是商(
int
类型),第二个是错误(error
类型),如果除数b
为 0,则返回错误。
2.6 没有返回值的函数
某些函数只执行操作,没有返回值,常用于执行副作用(如修改变量或打印输出):
func PrintMessage(message string) {
fmt.Println(message)
}
在这个例子中:
PrintMessage
函数接收一个string
类型的参数,并打印它。- 该函数没有返回值。
2.7 函数的参数和返回值
- 参数:函数接受的输入数据,可以有多个,也可以没有。
- 返回值:函数的输出,可以有多个返回值,也可以没有。
2.8 函数作为值
Go 语言允许将函数作为值传递,这意味着函数可以作为参数传递给其他函数,或者作为返回值返回。
func Add(a, b int) int {
return a + b
}
func ApplyOperation(a, b int, operation func(int, int) int) int {
return operation(a, b)
}
func main() {
result := ApplyOperation(3, 4, Add) // 将 Add 函数作为参数传递
fmt.Println(result) // 输出 7
}
2.9 匿名函数(闭包)
Go 也支持匿名函数(没有名字的函数),它们通常用于作为参数传递,或者在函数内部定义。
func main() {
add := func(a, b int) int {
return a + b
}
fmt.Println(add(2, 3)) // 输出 5
}
这个 add
函数就是一个匿名函数,它定义在 main
函数内部。
2.10 递归函数
递归是函数调用自身的过程。在 Go 中,递归函数的使用与其他语言相似。以下是一个简单的递归函数示例,用于计算阶乘:
func Factorial(n int) int {
if n == 0 {
return 1
}
return n * Factorial(n-1)
}
三、函数的可变参数
在 go 语言中,函数支持可变参数。这意味着你可以在函数调用时传入任意数量的参数,而不必预先指定参数的数量。可变参数允许函数接受零个或者多个相同类型的参数。
3.1 可变参数的语法
定义可变参数时,使用 ...
语法,表示一个参数可以接受多个值。具体格式如下:
func FunctionName(paramType ...Type) {
// Function body
}
paramType
是参数的名字。Type
是参数的类型。...
表示该参数是可变的,可以接受任意数量的Type
类型的参数。
3.2 使用可变参数
下面是一个简单的例子,展示如何使用可变参数来计算多个数的和: