ZetCode

Golang return 关键字

最后修改于 2025 年 5 月 7 日

本教程解释了如何在 Go 中使用 return 关键字。我们将通过不同返回场景的实际示例来涵盖函数返回。

return 语句会终止当前函数的执行,并可以选择将一个或多个值返回给调用者。它是 Go 中函数行为的基础。

在 Go 中,return 可以返回单个值、多个值,或者不返回值。执行时它总是立即退出函数。具有返回类型的函数必须返回该类型的值。

基本函数返回

return 最简单的用法是退出函数并返回单个值。此示例演示了一个基本的加法函数。

basic_return.go
package main

import "fmt"

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

func main() {
    sum := add(3, 4)
    fmt.Println("Sum:", sum)
}

add 函数返回两个整数的和。return 语句计算并返回结果。函数立即退出。

多个返回值

Go 支持从函数返回多个值。此示例展示了如何返回和接收多个值。

multiple_return.go
package main

import "fmt"

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("cannot divide by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

该函数同时返回结果值和错误值。这是 Go 中错误处理的常见模式。调用者分别接收这两个值。

命名返回值

Go 允许为返回值命名以提高清晰度。当使用空的 return 语句时,这些变量会自动返回。

named_return.go
package main

import "fmt"

func rectProps(length, width float64) (area, perimeter float64) {
    area = length * width
    perimeter = 2 * (length + width)
    return // naked return
}

func main() {
    a, p := rectProps(5, 3)
    fmt.Printf("Area: %.2f, Perimeter: %.2f\n", a, p)
}

返回值 areaperimeter 在函数签名中声明。空的 return 返回它们当前的值。这在某些情况下可以提高代码的可读性。

用于错误处理的提前返回

return 通常用于错误条件下的提前退出。此示例演示了 Go 中首先检查错误的常见模式。

early_return.go
package main

import (
    "fmt"
    "os"
)

func processFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return err // early return on error
    }
    defer file.Close()
    
    // Process file contents here
    fmt.Println("File processed successfully")
    return nil
}

func main() {
    err := processFile("test.txt")
    if err != nil {
        fmt.Println("Error:", err)
    }
}

如果文件打开失败,函数将立即返回。这种模式保持了主路径未缩进,并使错误情况清晰明了。

返回函数

Go 函数可以返回其他函数。此示例展示了一个返回具有对其作用域访问权限的闭包的函数。

return_function.go
package main

import "fmt"

func multiplier(factor int) func(int) int {
    return func(x int) int {
        return x * factor
    }
}

func main() {
    double := multiplier(2)
    triple := multiplier(3)
    
    fmt.Println("Double of 5:", double(5))
    fmt.Println("Triple of 5:", triple(5))
}

multiplier 函数返回另一个函数。返回的闭包会记住来自外部作用域的 factor 值。

返回结构体

函数可以返回复杂的类型,如结构体。此示例演示了返回自定义结构体类型。

return_struct.go
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func createPerson(name string, age int) Person {
    return Person{
        Name: name,
        Age:  age,
    }
}

func main() {
    p := createPerson("Alice", 30)
    fmt.Printf("%+v\n", p)
}

该函数返回一个完全初始化的 Person 结构体。调用者接收完整的结构体值。结构体返回在 Go 中对于复杂数据很常见。

返回指针

函数可以返回值的指针。这对于大型结构体或需要修改返回值的场景很有用。

return_pointer.go
package main

import "fmt"

func createCounter() *int {
    count := 0
    return &count
}

func main() {
    counter := createCounter()
    *counter++
    fmt.Println("Count:", *counter)
}

该函数返回指向局部变量的指针。在 Go 中,这是安全的,因为编译器会执行逃逸分析。调用者可以通过指针修改该值。

来源

Go 语言规范

本教程通过函数中不同返回模式的实际示例,涵盖了 Go 中的 return 关键字。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程