go函数定义要求参数名在前、类型在后,调用严格按位置匹配,不支持命名实参或默认参数;多返回值必须显式接收,值传递中含指针的类型可影响原数据,错误必须显式处理。

Go 里定义和调用函数没有隐藏路径,写错参数顺序、漏掉类型位置、忽略返回值,编译器当场报错——它不给你运行机会。
func 后面必须是「名 类型」,不能倒过来
Go 不接受 func add(int a, int b) int 这种写法。编译器会直接抛出 expected ')', found 'a'。类型必须紧贴在参数名后面,这是语法硬约束。
-
func add(a int, b int) int✅ 正确,每个参数都带名带类型 -
func max(a, b, c int) int✅ 同类型可缩写,但名字不能省 -
func format(name string, age int, active bool) string✅ 混合类型必须逐个声明 - 参数名不可省略,哪怕只用一次;想占位也得写
_,但不推荐滥用
调用时实参顺序必须严格匹配形参顺序
Go 不支持命名实参(比如 Python 的 func(name="x", age=25)),也不支持默认参数。传参就是按位置硬对齐。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
calculate(10, 5)返回sum=15, diff=5;反过来写calculate(5, 10)就是sum=15, diff=-5 - 如果函数签名是
func openFile(path string, mode int) (*os.File, error),你不能把mode放前面 - IDE 提示靠参数名辅助识别,但最终执行只认顺序——类型错配不会在编辑器里高亮,要等编译或运行时才发现
多返回值必须显式接收或忽略,不能只取一个
像 os.Open 这类返回 (*os.File, error) 的函数,你不能写 f := os.Open("x.txt"),Go 会报错:too many values in assignment。
- 正确写法是
f, err := os.Open("x.txt")或_, err := os.Open("x.txt") - 顺序不能颠倒:
err, f := os.Open("x.txt")会导致err被赋成*os.File类型,编译失败 - 命名返回值(如
func split(n int) (x, y int))支持裸return,但容易漏初始化某个变量,静默返回零值——这种隐式行为在线上容易埋雷
值传递 vs 表现像引用,关键看底层有没有指针
Go 所有参数都是值传递,但 []int、map[string]int、chan int、*T 这些类型,值本身含指针字段,所以修改元素会影响原数据。
- 传
slice进函数,改s[0] = 99会生效;但s = append(s, 1)若扩容,新 slice 就和原变量无关了 - 想确保增删操作生效,得把新
slice返回并重新赋值:s = extend(s) - 传
*struct{}最直白,但要注意 nil 指针解引用会 panic,调用前得判空 - 纯值类型(
int、string、struct{})传进去改再大也没用,外部完全无感
最常被忽略的其实是返回值处理逻辑——不是“能不能编译过”,而是“有没有真处理错误”。很多线上 panic 其实就源于 _, _ := someFunc() 这种看似省事的写法,结果错误被吞掉,问题延后爆发。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










