第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不支持 |
| 下划线 _ | 忽略不需要的返回值 |
| 封装 | 将逻辑封装为函数,隐藏细节 |
| 递归 | 函数调用自身 |
十、课后练习
- 编写一个无参数无返回值的函数,打印"Hello, Go!"
- 编写一个
add函数,接收两个int参数,返回它们的和 - 编写一个多返回值函数,同时返回两个数的和与差
- 调用上面的多返回值函数,用
_忽略其中一个返回值 - 思考:Go的函数声明与Java的方法声明有哪些不同?