首页 > 编程笔记

Go语言函数的定义和调用

在 Go 语言中,函数由 6 个要素组成:关键字 func、函数名、参数列表、返回值数据类型、函数体和返回值语句,每个程序可以编写很多函数,函数是程序的基本代码块。

由于 Go 语言是编译型语言,因此函数编写顺序不影响程序运行,但为了提高代码的可读性,最好把自定义函数写在主函数 main() 前面,自定义函数之间按照一定逻辑顺序编写,例如函数被调用的先后顺序。

编写函数的目的是将一个需要多行代码的复杂问题分解为简单任务来解决,而且同一个任务(函数)可以被多次调用,这有助于代码重用。

Go 语言的函数定义必须遵从以下格式:
func name(parameter)(returnType){
    代码块
    return value1, value2...
}
函数定义说明如下:
根据函数定义语法可以划分 4 种不同类型的函数,示例如下:
// 无参数无返回值
func name(){
    代码块
}

// 有参数无返回值
func name(n int){
    代码块
}

// 无参数有返回值
func name()(int){
    代码块
    return value
}

// 有参数有返回值
func name(n int)(int){
    代码块
    return value
}

我们以有参数有返回值的函数为例编写简单的应用示例,代码如下:
package main

import (
    "fmt"
    "strconv"
)

func myfun(name string, age int) (string, bool) {
    // 参数name和age
    // (string, bool)是返回值的数据类型
    var n string
    var b bool
    if name != "" {
         // 字符串拼接
         n = name + " is existence, age is " + strconv.Itoa(age)
         b = true
    } else {
         n = "name is not existence"
         b = false
    }
    // 返回值
    return n, b
}

func main() {
    // 调用函数,并设置返回值
    s, _ := myfun("Tom", 15)
    fmt.Println(s)
    // 调用函数,虽然有返回值,但函数外不需要使用
    myfun("Tom", 15)
}
上述代码定义了函数 myfun(),在主函数 main() 中调用函数 myfun(),具体说明如下:

1) 自定义函数 myfun() 设置函数参数 name 和 age,参数 name 的数据类型为字符串,参数 age 的数据类型为整型,参数之间使用逗号隔开。如果多个参数是同一数据类型,可以写在一起,如 name, addr string。

2) 自定义函数可以根据需要设置返回值,如果有返回值,则必须在参数后面设置返回值的数据类型,每个返回值都有对应的数据类型。

3) 返回值使用关键字 return,它将函数执行结果返回给函数之外的程序再进行操作。若有多个返回值,则返回值之间使用英文格式的逗号隔开,返回值的先后顺序与返回值数据类型一一对应。比如 myfun() 的返回值数据类型为 (string, bool),那么关键字 return 后面必须有两个返回值,并且返回值的数据类型依次为字符串和布尔型。

4) 函数调用是在主函数 main() 中调用自定义函数 myfun(),在调用过程中,根据函数参数依次设置相应数值,如需使用返回值,则要为其设置变量存放函数返回值;如果没有返回值或程序不需要使用返回值,则直接调用函数即可。

运行上述代码,运行结果为:

Tom is existence, age is 15


在实际开发中,很多函数方法都会设置 error 类型的返回值,error 类型的返回值通常用作函数运行结果,如果返回值为空值 nil,则说明函数调用成功;如果返回值不为空值 nil,则说明函数在运行过程中出现异常。

error 类型是 Go 语言定义的接口,主要记录程序运行中出现的异常信息,因此在 Go 语言中经常看到这样的代码格式:
fs, err := os.Open("output.txt")
if err != nil {
    fmt.Printf("调用函数Open()出现异常:%v", err)
}

推荐阅读