go函数声明必须显式写出参数和返回类型,不支持类型推导;调用时实参个数、顺序、类型须完全匹配;参数均为值传递,但切片/映射/通道/指针因内部含间接引用而表现特殊;函数是一等公民,类型由签名严格定义,闭包捕获变量引用而非快照。
函数声明必须显式写出参数和返回类型
Go 不支持类型推导的函数签名,func 关键字后必须紧跟着参数名和类型(类型在后),再是返回类型。漏写任一类型都会编译报错。
常见错误:把参数类型写在前面(像 C 或 Java 那样)——func add(int a, int b) int 是非法的,正确写法是 func add(a int, b int) int。
多个同类型参数可简写:func max(a, b, c int) int 等价于 func max(a int, b int, c int) int。
返回值也支持命名,例如 func split(n int) (x, y int),此时函数体内可直接用 x、y 赋值,且 return 可不带参数(“裸返回”),但仅限命名返回值且逻辑清晰时使用,否则易引发歧义。
调用时不能省略参数个数或类型匹配
Go 是强类型语言,函数调用时传入的实参个数、顺序、类型必须与声明完全一致。不存在默认参数、重载或可变参数自动补全。
可变参数用 ... 表示,但只能放在参数列表末尾,例如 func sum(nums ...int)。调用时可传 sum(1, 2, 3) 或 sum([]int{1,2,3}...);若传切片不加 ...,会报类型不匹配错误。
常见坑点: