💜 想真正擅长编程? 从一门课程开始,100% 免费

《笔记》第十六篇 函数说明

第16讲 函数说明

本讲基于视频实际讲解内容整理


一、Go函数 vs Java函数

老师开场对比了Go和Java在函数方面的根本区别:

特性 Java Go
独立函数 ❌ 没有独立函数,只有方法 ✅ 有独立函数
函数位置 必须写在类里面 可以直接写在包的全局
依赖关系 依赖类/结构体 不依赖任何类/结构体

核心区别:Java中所有函数都必须属于某个类,是"方法";而Go中函数可以独立存在于包级别,不需要依附于类。


二、func 关键字

Go使用 func 关键字来声明函数:

Go
func 函数名(参数列表) 返回类型 {
    函数体
}

三、函数的组成

一个完整的Go函数由以下几部分组成:

TEXT
func    add     (a int, b int)    int     { return a + b }
 └─1    └─2     └─────3───────    └─4─     └─────5──────┘
编号 组成部分 说明 是否可省略
1 func 关键字,声明函数 ❌ 不可省略
2 函数名 调用时使用的名称 ❌ 不可省略(匿名函数除外)
3 参数列表 括号内的入参 ✅ 可以没有参数
4 返回类型 函数返回值的类型 ✅ 可以没有返回值
5 函数体 花括号内的代码 ✅ 可以为空

老师指出:参数列表和返回类型可以省略,但不建议省略,保持代码清晰。

3.1 返回类型写在参数后面

Go的函数声明与C/Java不同,返回类型写在参数列表后面:

Go
// Go的写法:返回类型在后面
func add(a int, b int) int {
    return a + b
}

// C/Java的写法:返回类型在前面
// int add(int a, int b) { return a + b; }

四、函数示例

4.1 无参数无返回值

Go
func sayHello() {
    fmt.Println("Hello, Go!")
}

4.2 有参数有返回值

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

4.3 无参数有返回值

Go
func getPI() float64 {
    return 3.14159
}

五、封装概念

老师提到了封装的概念。封装是面向对象编程的重要特性之一:

  • 将数据(字段)和操作数据的方法(函数)包装在一起
  • 隐藏内部实现细节,只暴露必要的接口
  • 在Go中,通过首字母大小写控制可见性(大写=公有,小写=私有)

封装在函数层面体现为:将一段逻辑封装成函数,外部只需调用,不需要知道内部实现。


六、多返回值

Go语言支持函数返回多个值,这是Go区别于Java的一个重要特性(Java不支持多返回值):

Go
func divAndMod(a int, b int) (int, int) {
    return a / b, a % b
}

func main() {
    div, mod := divAndMod(17, 5)
    fmt.Println("商:", div)   // 3
    fmt.Println("余数:", mod)  // 2
}

七、用下划线忽略返回值

当函数有多个返回值,但只需要其中一部分时,可以用下划线 _ 忽略不需要的返回值:

Go
// 只需要商,不需要余数
div, _ := divAndMod(17, 5)
fmt.Println("商:", div)

八、递归

老师在本讲中简要提到了递归的概念:函数调用自身。

Go
// 递归示例:计算阶乘
func factorial(n int) int {
    if n <= 1 {
        return 1
    }
    return n * factorial(n-1)
}

递归将在第19讲中详细讲解。


九、本讲小结

知识点 要点
Go vs Java Go有独立函数,Java只有方法
func关键字 声明函数的关键字
函数组成 函数名、参数列表、返回类型、函数体
返回类型位置 写在参数列表后面
参数/返回值 可以省略,但不建议
多返回值 Go支持,Java不支持
下划线 _ 忽略不需要的返回值
封装 将逻辑封装为函数,隐藏细节
递归 函数调用自身

十、课后练习

  1. 编写一个无参数无返回值的函数,打印"Hello, Go!"
  2. 编写一个 add 函数,接收两个int参数,返回它们的和
  3. 编写一个多返回值函数,同时返回两个数的和与差
  4. 调用上面的多返回值函数,用 _ 忽略其中一个返回值
  5. 思考:Go的函数声明与Java的方法声明有哪些不同?