07 - Go 函数(上):定义、参数、返回值与实战技巧

文章目录


🚀 07 - Go 函数(上):定义、参数、返回值与实战技巧

在学习 Go 语言的过程中,函数(Function)是必须牢牢掌握的核心基础之一

无论是日常开发、框架源码阅读,还是面试,函数都是高频出现的知识点。

很多人刚学时觉得函数很简单,但一到实际使用,就会遇到各种问题:

  • 多返回值怎么优雅使用?
  • 命名返回值到底有什么用?
  • ... 可变参数是怎么回事?
  • 为什么 Go 推荐返回 error?

👉 本文带你从 0 到 1 吃透 Go 函数基础,并配合实战案例,让你真正掌握。


为什么要使用函数?

在没有函数之前,代码可能是这样的:

go 复制代码
package main

import "fmt"

func main() {
	a := 10
	b := 20
	fmt.Println(a + b)

	c := 30
	d := 40
	fmt.Println(c + d)
}

输出:

bath 复制代码
30
70

👉 问题:

  • 代码重复
  • 可读性差
  • 难以维护

✅ 使用函数优化:

go 复制代码
package main

import "fmt"

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

func main() {
	fmt.Println(add(10, 20))
	fmt.Println(add(30, 40))
}

输出:

bath 复制代码
30
70

👉 优势:

  • 代码复用
  • 逻辑清晰
  • 易于维护

函数的基本定义

Go 中函数定义格式如下:

go 复制代码
func 函数名(参数列表) 返回值类型 {
    // 函数体
}

示例:

go 复制代码
func add(a int, b int) int { // 因为a,b都是int,所以可以简写func add(a, b int) int 
	return a + b
}

调用方式:

go 复制代码
result := add(1, 2)
fmt.Println(result) // 输出结果:3

参数详解(必须掌握)

多参数简写

Go 支持相同类型参数的简写:

go 复制代码
func add(a, b int) int {
	return a + b
}

👉 等价于:

go 复制代码
func add(a int, b int) int

不同类型参数

go 复制代码
func printInfo(id int, name string) {
	fmt.Println(id, name)
}

参数是值传递(重点)

go 复制代码
package main

import "fmt"

func change(a int) {
	fmt.Println("three:", a)
	a = 100
	fmt.Println("four:", a)
}
func main() {
	x := 10
	fmt.Println("one:", x)
	change(x)
	fmt.Println("two:", x)
}

输出:

bath 复制代码
one: 10
three: 10
four: 100
two: 10

👉 说明:

  • Go 默认是值传递
  • 函数内部修改不会影响外部变量

返回值详解(核心重点🔥)

单返回值

go 复制代码
package main

import "fmt"

func sum(a, b int) int {
	return a + b
}
func main() {
	fmt.Println(sum(1, 2))
}

输出:

bath 复制代码
3

多返回值(Go 特色)

go 复制代码
func calc(a, b int) (int, int) {
	return a + b, a - b
}

调用:

go 复制代码
x, y := calc(10, 5)
fmt.Println(x, y)

忽略返回值

go 复制代码
x, _ := calc(10, 5)

👉 _ 表示忽略变量(非常常用)

go 复制代码
package main

import "fmt"

func calc(a, b int) (int, int) {
	sum := a + b
	diff := a - b

	return sum, diff
}

func main() {
	x, y := calc(5, 10)
	fmt.Println(x, y)
	z, _ := calc(5, 10)
	fmt.Println(z)
}

输出:

bath 复制代码
15 -5
15

返回 error(开发必备)

Go 中常见写法:

go 复制代码
func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, fmt.Errorf("除数不能为0")
	}
	return a / b, nil
}

调用:

go 复制代码
res, err := divide(10, 0)
if err != nil {
	fmt.Println("发生错误:", err)
	return
} else {
	fmt.Println("结果是:", res)
}

👉 这是 Go 的错误处理标准模式

go 复制代码
package main

import "fmt"

func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, fmt.Errorf("除数不能为0")
	}
	return a / b, nil
}

func main() {
	res, err := divide(10, 0)
	if err != nil {
		fmt.Println("发生错误:", err)
		return
	} else {
		fmt.Println("结果是:", res)
	}
}

输出:

bath 复制代码
错误: 除数不能为0

命名返回值(面试高频🔥)

go 复制代码
package main

import "fmt"

func calc(a, b int) (sum int, diff int) {
	sum = a + b
	diff = a - b
	return //看这里,只有一个return
}

func main() {
	x, y := calc(5, 10)
	fmt.Println(x, y)
}

输出:

bath 复制代码
15 -5

👉 特点:

  • 返回值提前声明
  • return 可以省略变量

⚠️ 注意不要滥用:

go 复制代码
func test() (res int) {
	res = 100
	return
}

👉 虽然简洁,但可读性可能变差(团队开发需谨慎)


可变参数(...)

当参数个数不固定时,可以使用 ...

go 复制代码
package main

import "fmt"

func sum(nums ...int) int {
	total := 0
	for _, v := range nums {
		total += v
	}
	return total
}
func main() {
	fmt.Println("sum():", sum())
	fmt.Println("sum(1):", sum(1))
	fmt.Println("sum(1, 2):", sum(1, 2))
	fmt.Println("sum(1, 2, 3):", sum(1, 2, 3))
}

输出:

bath 复制代码
sum(): 0
sum(1): 1
sum(1, 2): 3
sum(1, 2, 3): 6

👉 本质:

  • nums 是一个 slice(切片)

实战案例(必须掌握)

📌 求数组最大值

go 复制代码
package main

import "fmt"

func max(nums ...int) int {
	if len(nums) == 0 {
		return 0
	}
	maxVal := nums[0]
	for _, v := range nums {
		if v > maxVal {
			maxVal = v
		}
	}
	return maxVal
}
func main() {
	fmt.Println(max())
	fmt.Println(max(1))
	fmt.Println(max(1, 2))
	fmt.Println(max(1, 2, 3))
	fmt.Println(max(1, 2, 3, 4))
	fmt.Println(max(50, 66, 55, 77, 99, 65, 22, 35, 35, 69, 5, 65, 485, 548))
}

输出:

bath 复制代码
0
1
2
3
4
548

📌 封装计算逻辑

go 复制代码
package main

import "fmt"

func calc(a, b int) (int, int, int, int) {
	return a + b, a - b, a * b, a / b
}
func main() {
	sum, sub, mul, div := calc(10, 2)
	fmt.Println("Sum:", sum)
	fmt.Println("Subtraction:", sub)
	fmt.Println("Multiplication:", mul)
	fmt.Println("Division:", div)
}

输出:

bath 复制代码
Sum: 12
Subtraction: 8
Multiplication: 20
Division: 5

小结(建议收藏⭐)

本文我们系统学习了 Go 函数的基础知识:

✅ 函数的定义与调用

✅ 参数写法(简写 / 多类型)

✅ 返回值(单返回 / 多返回)

✅ error 处理规范(开发必备)

✅ 命名返回值(面试重点)

✅ 可变参数 ... 的使用


🎯 最后说一句

函数看起来简单,但它是 Go 后续学习的基础:

  • 接口(interface)
  • 并发(goroutine)
  • 中间件设计

👉 都会用到函数的高级特性


相关推荐
Tairitsu_H2 小时前
C语言:排序(二)
c语言·开发语言·算法
Robot_Nav2 小时前
ThetaStar全局规划算法纯C++控制器详解
开发语言·c++·lazy_theta_star
雾岛听蓝3 小时前
进程信号机制深度解析
linux·开发语言·经验分享·笔记
一灯架构10 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
踏着七彩祥云的小丑10 小时前
pytest——Mark标记
开发语言·python·pytest
Dream of maid10 小时前
Python12(网络编程)
开发语言·网络·php
W230357657311 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
Y40900111 小时前
【多线程】线程安全(1)
java·开发语言·jvm
不爱吃炸鸡柳11 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python