Go函数需显式声明参数和返回类型,调用时严格匹配个数与类型;支持多返回值而非tuple,命名返回值启用裸返回但易引发歧义;不可嵌套定义函数,空参数必须写()。

函数定义和调用的基本写法
Go 里函数必须显式声明参数类型和返回类型,不能省略。定义时用 func 关键字,参数列表紧接函数名,返回类型写在最后。
常见错误是把参数类型写在变量名后面却漏了括号,或者调用时传参个数/类型不匹配——Go 编译期直接报错,不会运行时才发现。
-
func add(a int, b int) int { return a + b }—— 参数类型必须写全,int, int不能简写成int int - 调用必须严格按顺序、按类型传参:
add(3, 5)合法,add("3", 5)编译失败 - 函数名首字母小写表示包内私有,大写才可被其他包调用
多返回值怎么写,为什么不是 tuple
Go 的多返回值不是语法糖,也不是类似 Python 的 tuple 解包;它是语言原生支持的并列返回机制,调用方必须显式接收全部返回值,或用 _ 忽略。
典型场景是错误处理:os.Open 总是返回 *os.File 和 error,你不能只取第一个。
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 定义:用括号包裹多个返回类型,如
func split(s string) (string, string) - 调用:必须用多个变量接收,
a, b := split("hello world");若只想要第一个,得写a, _ := split(...) - 少接收一个变量会编译报错:
a := split(...)❌ - 返回值数量、类型必须和声明完全一致,不支持“部分返回”
命名返回值的作用和陷阱
在函数签名中给返回值起名(如 (result int, err error)),会让这些名字自动声明为局部变量,可在函数体内直接赋值,最后用 return(无参数)结束——这叫“裸返回”。但裸返回容易掩盖逻辑歧义。
它适合简单函数,比如包装标准库调用;复杂分支逻辑中混用裸返回,会导致返回值状态难以追踪。
- 命名后可直接赋值:
result = 42; err = nil; return,等价于return 42, nil - 裸返回在 defer 中可能捕获到未更新的返回值(因为命名返回值在函数入口就初始化了)
- 如果函数有多个 return 路径,建议统一用显式
return val1, val2,避免部分路径裸返回、部分显式返回带来的维护风险 - 导出函数尽量不用裸返回,尤其当返回值含义不直观时(比如
(int, int, bool)不如(count int, total int, ok bool))
实际写函数时最容易忽略的一点
Go 函数不能嵌套定义(即不能在函数内部再写 func),但可以将函数作为值赋给变量或传参——这意味着你想复用一段逻辑,要么提成顶层函数,要么用闭包模拟。
另外,空参数列表必须写 (),不能省略;返回类型为 error 时,别忘了导入 "errors" 或用 fmt.Errorf,直接写 return nil 会类型不匹配。

















