Go函数需用func声明,参数和返回值类型必须显式写在变量名后,不支持重载、默认参数和函数提升;调用前必须可见,类型错误或参数不匹配在编译期报错。

Go 里函数不是“定义”出来的,是用 func 声明的;没函数提升(hoisting)、没默认参数、没重载,调用前必须可见,类型必须显式写在变量名后面——写错位置(比如 func add(int a, int b) int)直接编译失败。
函数声明语法:类型必须写在参数名后面
这是最常踩坑的地方。C/Java 风格的 int a 在 Go 里不合法,正确写法是 a int。多个同类型参数可以省略中间类型,比如 a, b int 合法,a int, b int 也合法,但 int a, int b 会报 syntax error: unexpected int。
- 单返回值:直接写类型,如
func max(a, b int) int - 多返回值:用括号包裹,如
func split(n int) (quotient, remainder int),括号里可命名返回值,也可只写类型(int, int) - 无参无返回:写成
func greet(),不能省略括号
调用时必须严格匹配参数个数和类型
Go 不支持缺省参数,也不支持按名传参。传参少了、多了、类型不对,都在编译期报错,不会等到运行时。
-
split(10)合法;split()或split("hello")直接编译失败 - 接口类型参数不能靠“隐式实现”绕过:哪怕
*os.File实现了io.Reader,你也得显式传reader *os.File,不能传file *os.File然后指望它自动转 - 包级函数首字母小写(如
helper())只能在本包内调用;跨包必须大写(Helper())且对应包已导入
函数 vs 方法:接收者不是参数,但决定调用方式
func (p Person) SayHello() 是方法,不是函数。它不能脱离实例调用,也不能像普通函数那样被赋值给 func() 类型变量——除非你显式转换,比如 func() { p.SayHello() }。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
立即学习“go语言免费学习笔记(深入)”;
- 值接收者(
p Person)适合只读操作,避免拷贝大结构体时加const语义 - 指针接收者(
p *Person)才能修改字段,且该类型的方法集只包含指针接收者方法 - 别误以为
MyType.Method是个可传递的函数值——它不是,fmt.Printf("%T", MyType.Method)会编译失败
返回函数时:签名必须完整,闭包变量生命周期要盯紧
函数返回函数,类型声明必须带全参数和返回值,比如 func() func(int) string。漏掉任何一部分都会报 missing function body 或类型不匹配。
- 返回的匿名函数字面量(
func(x int) string { ... })必须和声明类型完全一致,参数名可省,但类型和顺序不能错 - 循环中生成闭包容易复用同一个变量地址:写
for _, v := range vals { fns = append(fns, func() { println(v) }) },最后所有函数都打印最后一个v - 修复方式很简单:在循环体内用新变量捕获,如
val := v; fns = append(fns, func() { println(val) })
真正难的不是语法,是判断什么时候该用函数、什么时候该用方法、什么时候该返回函数——比如状态封装用 struct + method,通用计算逻辑用 package-level func,预设行为模板才考虑返回函数。这些边界不画清,代码很快会变得难以追踪调用链和内存归属。

















