0

0

Go语言函数如何定义_Golang函数声明基础语法

P粉602998670

P粉602998670

发布时间:2026-01-26 14:33:10

|

249人浏览过

|

来源于php中文网

原创

Go函数声明基本结构为func name(参数列表) 返回类型 {函数体},必须显式声明返回类型;多返回值需用括号包裹类型列表;所有参数均为值传递;main函数必须在main包中且签名严格为func main()。

go语言函数如何定义_golang函数声明基础语法

Go函数声明的基本结构长什么样

Go语言里函数必须显式声明返回类型,没有隐式推导。最简形式是 func name() {},但只要函数有返回值,就得在括号后写明类型,哪怕只返回一个值也要加括号包裹:func add(a, b int) int,不能写成 func add(a, b int) int(这其实是合法的,但注意:多个参数同类型可省略重复类型,如 a, b int 是对的;常见误写是漏掉最后的返回类型或错用逗号分隔返回类型)。

常见错误现象:missing function body(忘了写花括号)、non-name function parameter(参数没起名,比如写成 func(int, int) int 而没给参数命名,虽然匿名参数语法合法,但绝大多数场景需要命名才能在函数体内使用)。

多个返回值怎么写才不报错

Go支持多返回值,但必须用括号包裹返回类型列表,例如 func split(n int) (int, int)。括号不能省,否则编译器会认为只返回一个类型为 int, int 的非法类型。

  • 命名返回值更安全:写成 func split(n int) (x, y int),这样函数体里可以直接用 xy 赋值,且 return 可以无参数(即“裸 return”),但要注意——裸 return 在闭包或带 defer 的函数中容易引发意外行为
  • 未命名多返回值必须显式 return 多个值:return a, b,顺序和声明顺序严格一致
  • 如果只想要其中一个返回值,用下划线丢弃:_, err := os.Open("x"),但不能写成 err := os.Open("x")(类型不匹配)

函数参数是值传递还是引用传递

Go所有参数都是值传递,包括 slice、map、chan、interface、指针。关键在于:传的是“变量的值”,而这个值可能是地址(如指针)或结构体副本(如 struct)。所以 func modify(s []int) 看似传 slice,实际传的是包含指针、长度、容量的 header 副本——修改元素会影响原 slice,但 append 后若底层数组扩容,原 slice 不会变。

立即学习go语言免费学习笔记(深入)”;

NeoAgent
NeoAgent

销售易推出的AI‑CRM智能体平台

下载

容易踩的坑:

  • 想修改原始 struct 字段?传指针:func update(p *Person),否则改的是副本
  • 传 map 或 slice 时误以为“传引用就能扩容影响原变量”,其实不能——扩容后新 header 不会回写到调用方
  • 接口类型参数(如 io.Reader)也是值传递,但内部可能持有所需的指针,行为取决于具体实现

main 函数为什么必须在 main 包里

main 函数不是关键字,而是 Go 运行时约定的入口标识符。它必须满足两个硬性条件:所在包为 main,且函数签名为 func main()(无参数、无返回值)。其他任何变体,比如 func main(args []string)func main() int,都会导致 runtime: no main function 或链接失败。

常见混淆点:

  • 写测试时用 func TestXxx(t *testing.T),这是 testing 包约定,和 main 无关
  • 命令行参数通过 os.Args 获取,不是 main 的参数
  • 想让某个函数被外部调用?别叫它 main,改成普通函数名,并确保它在非-main 包中导出(首字母大写)

函数签名看似简单,但参数命名、返回值括号、值传递语义、main 的约束这四点,任一疏忽都直接卡在编译或运行时行为上。尤其当从其他语言转来时,习惯性加 return 类型推导或默认引用传递,最容易掉进坑里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

286

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

256

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

123

2025.08.07

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

1

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号