Go函数需用func显式声明完整签名,无hoisting和重载;首字母决定导出性;调用严格匹配参数顺序与类型;闭包捕获变量而非值。

Go 语言里函数不是“定义”出来的,而是用 func 关键字声明的——它没有函数表达式、没有 hoisting、不支持重载,写错位置或少个参数就直接报错。
func 声明必须带完整签名,不能省略返回类型
很多人从 JavaScript 或 Python 转过来,习惯先写 func add(a, b),结果编译器立刻报 missing function body 或 expected type。Go 要求所有参数和返回值类型都显式写出,哪怕返回空结构也要写 ()。
-
func sayHello() {}✅ 正确:无参无返回 -
func max(a, b int) int { return … }✅ 正确:两个int参数,一个int返回 -
func max(a, b int) { ... }❌ 错误:返回类型缺失,哪怕不返回也得写() -
func calc(x, y float64) (float64, error)✅ 支持多返回,常见于错误处理场景
函数名首字母决定导出性,小写=包内私有
Go 没有 private / public 关键字,靠命名规则控制可见性。这点常被忽略,导致跨包调用时编译器报 undefined。
-
func DoWork()✅ 可被其他包调用(首字母大写) -
func doWork()✅ 合法函数,但仅限当前包内使用 -
import "mymodule"; mymodule.doWork()❌ 编译失败:小写名无法导出 - 包内测试文件(
*_test.go)可以访问小写函数,但外部包不行
调用时参数顺序和类型严格匹配,不支持命名参数
Go 不支持像 Python 那样用 func(name="xxx") 调用,也不做隐式类型转换。传错顺序、少传、多传、类型不对,统统编译失败。
立即学习“go语言免费学习笔记(深入)”;
-
func connect(host string, port int) error声明后,只能写connect("localhost", 8080) -
connect(8080, "localhost")❌ 类型错位,编译报cannot use int as string -
connect("localhost")❌ 少参数,报not enough arguments - 想模拟“可选参数”,得用结构体传参:
connect(Config{Host: "x", Port: 8080})
闭包和匿名函数要小心变量捕获时机
Go 的匿名函数能访问外层变量,但捕获的是变量本身,不是快照。循环中创建多个 goroutine 并引用循环变量,很容易全拿到最后一个值。
for i := 0; i → 很可能输出三个 <code>3- 修复方式:传参进去
go func(n int) { fmt.Println(n) }(i),或在循环内用新变量val := i; go func() { fmt.Println(val) }() - 闭包里修改外层变量是允许的,但要注意并发安全——没加锁就多个 goroutine 写同一变量,行为未定义
函数签名一旦写进公开接口,改参数或返回值就是破坏性变更;而 Go 没有版本化函数名机制,所以一开始把 error 放在返回列表末尾、把配置收进 struct,这些细节不是风格问题,是后续能不能平滑迭代的关键。


















