自定义函数函数

在 Go 语言中,我们可以定义两种类型的函数:普通函数和方法。这两种函数有一些区别,下面分别介绍它们的定义方式和特点。

普通函数定义

普通函数是独立于任何类型的函数,它不依赖于任何结构体或接口。普通函数的定义方式如下:

package main

import "fmt"

// 定义一个普通函数
func add(a, b int) int {
    return a + b
}

func main() {
    result := add(3, 5)
    fmt.Println(result) // Output: 8
}

在上面的示例中,add 函数是一个普通函数,它接收两个 int 类型的参数,并返回它们的和。

类的方法定义

方法是与特定类型关联的函数,它必须在某种类型的上下文中被调用。方法可以被定义在结构体类型上,也可以定义在自定义类型上。方法的定义方式如下:

package main

import "fmt"

// 定义一个结构体类型
type Rectangle struct {
    width, height float64
}

// 为 Rectangle 结构体类型定义一个方法
func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func main() {
    // 创建一个 Rectangle 对象
    rect := Rectangle{width: 3, height: 4}

    // 调用 Rectangle 对象的方法
    area := rect.Area()
    fmt.Println(area) // Output: 12
}

在上面的示例中,我们定义了一个 Rectangle 结构体类型,然后为其定义了一个名为 Area 的方法。注意,方法的定义方式是在 func 关键字和方法名之间加上一个括号,括号里的参数指定了该方法是作用于哪种类型的对象上的。在这个例子中,(r Rectangle) 表示该方法是作用于 Rectangle 结构体类型上的。

总结一下,普通函数是独立的函数,而方法是与特定类型关联的函数。普通函数的定义方式更简单,而方法的定义方式需要在函数名之前加上一个接收者(receiver),指定该方法作用于哪种类型的对象上。

定义函数或方法的返回值

在 Go 中,函数或方法的返回值可以是单个值,也可以是多个值。返回值的定义在函数或方法的签名中。

单个返回值

单个返回值的定义方式如下:

func functionName(parameters) returnType {
    // 函数体
    return value
}

在这个定义中,returnType 指定了函数或方法的返回类型,value 是函数或方法执行完毕后要返回的值。

举个例子:

func add(a, b int) int {
    return a + b
}

这个函数接收两个 int 类型的参数,并返回它们的和。

多个返回值

多个返回值的定义方式如下:

func functionName(parameters) (returnType1, returnType2, ...) {
    // 函数体
    return value1, value2, ...
}

在这个定义中,圆括号中包含了多个返回类型,函数或方法执行完毕后会返回这些值。

举个例子:

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

这个函数接收两个 int 类型的参数,并返回两个值,第一个值是除法结果,第二个值是可能的错误。

特殊函数

Go语言中有一些特殊的函数,它们提供了额外的功能或者是用于特定的目的。以下是一些常见的特殊函数

init函数

init函数用于在程序运行开始时执行初始化任务。每个包可以包含多个init函数,它们按照声明的顺序执行。

package main
import "fmt"
func init() {
    fmt.Println("Initializing...")
}
func main() {
    fmt.Println("Main function")
}

main函数

main函数是每个独立可执行程序的入口点。当程序启动时,会首先执行main函数。

package main
import "fmt"
func main() {
    fmt.Println("Hello, world!")
}

defer函数

defer语句用于在函数执行结束时延迟执行某个函数调用。它通常用于确保在函数返回之前执行清理操作,比如关闭文件或释放资源。

package main
import "fmt"
func cleanup() {
    fmt.Println("Cleaning up...")
}
func main() {
    defer cleanup() // cleanup函数将在main函数返回之前被调用
    fmt.Println("Doing something...")
}

panic和recover函数

panic函数用于引发程序错误,而recover函数用于从panic中恢复。一般情况下,panic会导致程序崩溃并输出错误信息,但可以通过recover来捕获这些panic并进行处理。

package main
import "fmt"
func recoverFromPanic() {
    if r := recover(); r != nil {
        fmt.Println("Recovered from panic:", r)
    }
}
func doSomething() {
    defer recoverFromPanic()
    fmt.Println("Doing something...")
    panic("Oops! Something went wrong...")
}
func main() {
    doSomething()
    fmt.Println("Continuing execution...")
}

这些是一些Go语言中常见的特殊函数,它们在不同的场景中发挥着重要的作用。