go函数必须显式声明完整签名,参数和返回值类型不可省略,命名首字母决定导出性,调用时严格匹配顺序与类型,不支持重载或隐式转换。

Go 语言里没有“函数定义”,只有 func 声明;写错一个类型、少一个括号、漏掉返回值类型,编译器立刻报错,不给你运行机会。
func 声明必须带完整签名,不能省略参数或返回值类型
很多人从 Python 或 JS 转过来,习惯写 func add(a, b),结果编译失败:报 expected type 或 missing function body。Go 要求所有参数和返回值类型都显式写出,哪怕无参无返回也得写空括号。
-
func sayHello() {}✅ 正确:无参无返回 -
func max(a, b int) int { return a }✅ 正确:两个int参数,一个int返回 -
func max(a, b int) { }❌ 错误:返回类型缺失,哪怕不返回也得写() -
func calc(x, y float64) (float64, error)✅ 支持多返回,常见于错误处理场景
参数类型写在变量名后面,同类型可简写
Go 的参数声明是 name type 顺序,不是 type name。多个同类型参数可以合并类型,但不能跨类型混写。
-
func f(a, b, c int) string✅ 合法:a、b、c都是int -
func f(a int, b, c string)✅ 合法:分组声明 -
func f(a, b int, c string)✅ 合法 -
func f(a int, b string, c int)❌ 不推荐:虽能编译,但易读性差,容易传错顺序
函数名首字母决定导出性,小写=包内私有
Go 没有 public/private 关键字,靠命名规则控制可见性。这点常被忽略,导致跨包调用时报 undefined。
-
func DoWork()✅ 可被其他包调用(首字母大写) -
func doWork()✅ 合法函数,但仅限当前包内使用 -
import "mymodule"; mymodule.doWork()❌ 编译失败:小写名无法导出 - 包内测试文件(
*_test.go)可以访问小写函数,但外部包不行
调用时参数顺序和类型严格匹配,不支持命名参数或隐式转换
Go 不支持像 Python 那样用 func(name="xxx") 调用,也不做任何隐式类型转换。传错顺序、少传、多传、类型不对,统统编译失败。
-
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 没有函数重载,也没有版本化函数名机制,所以第一次写就要想清楚要不要加 error、要不要把 context.Context 放第一个参数。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











