Go语言零基础——函数|青训营

193 阅读5分钟

函数是一种独立的代码块,用于执行特定的任务,并且可以被多次调用。在Go语言中,函数是基本的代码组织单元,具有重要的作用。本文将为你介绍Go语言中函数的基本概念、定义方式和常见用法。

一、函数的基本概念

在编程中,函数用于将一组相关的代码块封装起来,并赋予其一个名称。通过函数,我们可以提高代码的可读性、可维护性和复用性。在Go语言中,函数具有以下特点:

  1. 函数由函数名、参数列表、返回值列表以及函数体组成。
  2. 函数名用于标识函数,并在调用时使用。
  3. 参数列表是一组用逗号分隔的参数,用于接收外部传入的数据。
  4. 返回值列表是一组用逗号分隔的返回值,用于将处理结果返回给调用者。
  5. 函数体包含了具体的代码逻辑,用于执行特定的任务。

二、函数的定义方式

在Go语言中,函数的定义方式有两种:带有函数名的函数和匿名函数。

函数名命名规范

遵循标识符命名规范:见名知意,驼峰命名

不能以数字开头

首字母大写该函数可以被本包文件和其他包文件使用(类似于public)

首字母小写只能被本包文件使用,其他包文件不能使用(类似于private)

带有函数名的函数

带有函数名的函数是最常见的函数类型,它们使用函数名标识,并可以被其他代码块调用。函数的定义格式如下:

func 函数名(参数列表) (返回值列表) {
    // 函数体
}

例如:

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

在上述示例中,add是一个函数名,它接收两个参数ab,并返回它们的和。

匿名函数

匿名函数没有函数名,通常用于需要在代码块内定义和使用的场景。匿名函数可以直接赋值给变量或作为参数传递给其他函数。匿名函数的定义格式如下:

func(参数列表) (返回值列表) {
    // 函数体
}

例如:

func main() {
    sum := func(a, b int) int {
        return a + b
    }

    result := sum(3, 4)
    fmt.Println(result) // 输出:7
}

在上述示例中,匿名函数被赋值给变量sum,然后通过sum(3, 4)进行调用。

三、函数的常见用法

在Go语言中,函数被广泛应用于各种场景,下面介绍几个常见的函数用法。

1. 函数的调用

函数的调用通过函数名和参数列表完成,调用方式如下:

result := 函数名(参数列表)

例如:

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

sum := add(3, 4)
fmt.Println(sum) // 输出:7

2. 多返回值函数

在Go语言中,函数可以返回多个值,通过逗号分隔。多返回值函数可以方便地将多个处理结果一次性返回。例如:

func divide(a, b int) (int, int) {
    quotient := a / b
    remainder := a % b
    return quotient, remainder
}

q, r := divide(10, 3)
fmt.Println(q, r) // 输出:3 1

3. 变长参数函数

变长参数函数允许接受可变数量的参数。在Go语言中,可以使用...来表示变长参数。例如:

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

result := sum(1, 2, 3, 4, 5)
fmt.Println(result) // 输出:15

四、下划线_在函数中的作用

忽略某个返回值

在函数多返回值的情况下,可以使用下划线 _ 来忽略不需要的返回值。例如:

func divide(a, b int) (int, int) {
    quotient := a / b
    remainder := a % b
    return quotient, remainder
}

q, _ := divide(10, 3)
fmt.Println(q) // 输出:3,忽略了余数

在上述示例中,通过使用 _ 来忽略了除法操作的余数。

在导入包时使用空标识符

在使用 import 导入包时,如果只希望执行包的初始化代码而不直接使用包的其他内容,可以使用下划线 _ 作为空标识符。例如:

import (
    "fmt"
    _ "net/http"
)

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

在上述示例中,通过使用 _ 可以执行 net/http 包的初始化代码,但并未直接使用该包的其他内容。

五、type在函数中的应用

1. 类型定义

type 关键字可以用于在函数内部定义新的自定义类型。这些类型只在函数内部可见,称为局部类型。这种类型定义通常用于函数的内部逻辑,并且在函数外部是不可见的。例如:

func calculate() {
    type Point struct {
        X, Y int
    }

    p := Point{X: 1, Y: 2}
    fmt.Println(p) // 输出:{1 2}
}

上述示例中,在 calculate 函数中使用 type 关键字定义了一个名为 Point 的结构体类型,并在函数内部创建了一个 Point 类型的变量 p

2. 类型别名

type 关键字也可以用于在函数内部为现有类型创建类型别名。类型别名可用于提高代码的可读性或简化代码。与全局类型别名不同,函数内部的类型别名只在函数内部有效。例如:

func convertTemperature(celsius float64) {
    type Celsius float64
    type Fahrenheit float64

    c := Celsius(celsius)
    f := CelsiusToFahrenheit(c)
    fmt.Println(f)
}

func CelsiusToFahrenheit(c Celsius) Fahrenheit {
    return Fahrenheit(c*9/5 + 32)
}

上述示例中,在 convertTemperature 函数内部使用 type 关键字为 float64 类型创建了两个局部类型别名 CelsiusFahrenheit,然后使用这两个类型别名进行温度转换。

3. 参数类型

type 关键字也可以用于函数参数的类型定义。通过为某个类型定义别名或创建新的自定义类型,可以提高代码的可读性和表达能力。例如:

func calculateDistance(p1, p2 Point) float64 {
    // 函数逻辑...
}

type Point struct {
    X, Y int
}

上述示例中,calculateDistance 函数接受两个 Point 类型的参数,并计算它们之间的距离。Point 类型在函数之前被定义,作为函数的参数类型使用。