news 2026/6/23 5:28:37

Go之路 - 7.go的函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go之路 - 7.go的函数

一、函数基础

1.1 函数声明

// 基本语法func函数名(参数列表)(返回值列表){// 函数体}// 示例funcadd(xint,yint)int{returnx+y}// 简化参数类型(相同类型)funcmultiply(x,yint)int{returnx*y}

1.2 多返回值

// 返回多个值funcswap(x,ystring)(string,string){returny,x}// 命名返回值funcsplit(sumint)(x,yint){x=sum*4/9y=sum-xreturn// 裸返回,自动返回x和y}

二、函数类型与高级特性

2.1 函数作为值

funcmain(){// 函数赋值给变量add:=func(x,yint)int{returnx+y}fmt.Println(add(3,4))// 7// 函数作为参数calculate:=func(fnfunc(int,int)int,a,bint)int{returnfn(a,b)}result:=calculate(add,5,3)fmt.Println(result)// 8}

2.2 闭包

// 返回函数的函数funcadder()func(int)int{sum:=0returnfunc(xint)int{sum+=xreturnsum}}funcmain(){pos,neg:=adder(),adder()fori:=0;i<10;i++{fmt.Println(pos(i),// 0, 1, 3, 6, 10...neg(-2*i),// 0, -2, -6, -12...)}}

2.3 可变参数

// ... 表示可变参数funcsum(numbers...int)int{total:=0for_,num:=rangenumbers{total+=num}returntotal}funcmain(){fmt.Println(sum(1,2,3))// 6fmt.Println(sum(1,2,3,4,5))// 15// 切片作为可变参数nums:=[]int{1,2,3,4}fmt.Println(sum(nums...))// 10}

三、方法与接收者

3.1 方法定义

typeRectanglestruct{width,heightfloat64}// 值接收者func(r Rectangle)area()float64{returnr.width*r.height}// 指针接收者(可以修改结构体)func(r*Rectangle)scale(factorfloat64){r.width*=factor r.height*=factor}funcmain(){rect:=Rectangle{width:3,height:4}fmt.Println(rect.area())// 12rect.scale(2)fmt.Println(rect.width,rect.height)// 6 8}

3.2 接收者选择

typeCounterstruct{valueint}// 值接收者:不修改原对象,适用于小型结构体func(c Counter)GetValue()int{returnc.value}// 指针接收者:需要修改对象或避免复制大对象func(c*Counter)Increment(){c.value++}// 指针接收者:确保一致性(推荐)func(c*Counter)Decrement(){c.value--}

四、函数高级特性

4.1 延迟执行(defer)

funcprocessFile(filenamestring)error{file,err:=os.Open(filename)iferr!=nil{returnerr}deferfile.Close()// 确保文件被关闭// 多个defer按LIFO顺序执行deferfmt.Println("文件处理完成")deferfmt.Println("清理临时资源")// 处理文件...returnnil}

4.2 匿名函数

funcmain(){// 立即执行函数func(){fmt.Println("立即执行")}()// 延迟执行的匿名函数deferfunc(){fmt.Println("延迟执行")}()// 作为回调nums:=[]int{1,2,3,4}squares:=make([]int,len(nums))fori,v:=rangenums{func(xint){squares[i]=x*x}(v)}fmt.Println(squares)// [1 4 9 16]}

4.3 错误处理函数

// 返回错误的函数funcdivide(a,bfloat64)(float64,error){ifb==0{return0,errors.New("除数不能为零")}returna/b,nil}// 带错误处理的辅助函数funcmustDivide(a,bfloat64)float64{result,err:=divide(a,b)iferr!=nil{panic(err)}returnresult}

五、接口与函数

5.1 函数类型实现接口

typeHandlerfunc(string)string// 为函数类型添加方法func(h Handler)Process(sstring)string{returnh(s)}// 函数作为接口实现typeStringProcessorinterface{Process(string)string}funcmain(){varprocessor StringProcessor// 函数转换为Handler类型upper:=Handler(strings.ToUpper)processor=upper fmt.Println(processor.Process("hello"))// HELLO}

5.2 回调函数模式

typeFilterFuncfunc(int)boolfuncfilter(numbers[]int,fn FilterFunc)[]int{varresult[]intfor_,n:=rangenumbers{iffn(n){result=append(result,n)}}returnresult}funcmain(){numbers:=[]int{1,2,3,4,5,6,7,8,9}// 偶数筛选even:=filter(numbers,func(nint)bool{returnn%2==0})// 大于5筛选large:=filter(numbers,func(nint)bool{returnn>5})fmt.Println(even)// [2 4 6 8]fmt.Println(large)// [6 7 8 9]}

六、最佳实践与模式

6.1 函数选项模式

typeServerstruct{hoststringportinttimeout time.Duration}typeOptionfunc(*Server)funcWithHost(hoststring)Option{returnfunc(s*Server){s.host=host}}funcWithPort(portint)Option{returnfunc(s*Server){s.port=port}}funcWithTimeout(timeout time.Duration)Option{returnfunc(s*Server){s.timeout=timeout}}funcNewServer(opts...Option)*Server{s:=&Server{host:"localhost",port:8080,timeout:30*time.Second,}for_,opt:=rangeopts{opt(s)}returns}funcmain(){// 使用选项模式server:=NewServer(WithHost("127.0.0.1"),WithPort(9000),WithTimeout(60*time.Second),)}

6.2 中间件模式

typeMiddlewarefunc(http.HandlerFunc)http.HandlerFuncfunclogging(next http.HandlerFunc)http.HandlerFunc{returnfunc(w http.ResponseWriter,r*http.Request){start:=time.Now()next(w,r)fmt.Printf("请求处理耗时: %v\n",time.Since(start))}}funcauth(next http.HandlerFunc)http.HandlerFunc{returnfunc(w http.ResponseWriter,r*http.Request){token:=r.Header.Get("Authorization")iftoken==""{http.Error(w,"未授权",http.StatusUnauthorized)return}next(w,r)}}// 组合中间件funcchain(middlewares...Middleware)Middleware{returnfunc(next http.HandlerFunc)http.HandlerFunc{fori:=len(middlewares)-1;i>=0;i--{next=middlewares[i](next)}returnnext}}

七、性能考虑

7.1 内联优化

// 小函数会被编译器内联funcadd(a,bint)int{returna+b}// 避免复杂函数影响内联funccomplexCalculation(x,yint)int{// 复杂逻辑...returnresult}

7.2 内存分配

// 避免在热路径中分配内存funcprocess(data[]byte){// 复用缓冲区varbuf[1024]byte// ... 处理逻辑}// 使用sync.Pool重用对象varbufferPool=sync.Pool{New:func()interface{}{returnmake([]byte,0,1024)},}

总结要点

  1. 函数设计原则

    • 保持函数简短(建议不超过50行)
    • 单一职责原则
    • 良好的命名和文档
  2. 错误处理

    • 使用多返回值处理错误
    • 尽早返回错误
    • 提供上下文信息
  3. 性能考虑

    • 小函数有利于内联
    • 避免不必要的内存分配
    • 合理使用指针接收者
  4. 代码组织

    • 相关函数分组
    • 使用接口抽象行为
    • 遵循Go惯用模式
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 20:22:48

Chet.QuartzNet.UI 基于VbenAdmin框架的现代化UI体验

&#x1f525; Chet.QuartzNet.UI 基于VbenAdmin框架的现代化UI体验 &#x1f3af; 为什么VbenAdmin是个好选择&#xff1f; Chet.QuartzNet.UI 采用了 VbenAdmin 作为前端框架&#xff0c;VbenAdmin 是一款基于 Vue 3 TypeScript Ant Design Vue 开发的现代化管理系统框架&a…

作者头像 李华
网站建设 2026/6/23 3:01:20

AI 在泛前端领域的思考和实践-上篇

在大模型、AI Agent、Vibe Coding 与 Spec Coding 飞速发展的浪潮中&#xff0c;AI 与泛前端的融合正引发行业的深度思考&#xff1a;AI 究竟会 “替代” 传统开发模式&#xff0c;还是会推动一场效率与体验的全新 “革命”&#xff1f;它又将为泛前端领域带来哪些底层变革&…

作者头像 李华
网站建设 2026/6/23 19:52:33

靠谱的厦门考研哪个好选哪个

靠谱的厦门考研机构如何选择&#xff1a;以厦门博学乐思为例引言随着考研竞争的日益激烈&#xff0c;越来越多的学生开始寻求专业的考研辅导机构来提升自己的竞争力。在厦门&#xff0c;有许多考研辅导机构可供选择&#xff0c;但如何找到一个靠谱且适合自己的机构呢&#xff1…

作者头像 李华
网站建设 2026/6/23 11:09:48

高通万卫星:混合AI与分布式协同是未来 | MEET2026

编辑部 整理自 MEET2026量子位 | 公众号 QbitAI从“感知”到“生成”&#xff0c;再到自主行动的“智能体”&#xff0c;AI正在终端侧掀起一场无声的算力革命。在量子位MEET2026智能未来大会上&#xff0c;高通公司AI产品技术中国区负责人万卫星指出&#xff1a;尽管目前行业关…

作者头像 李华
网站建设 2026/6/22 20:56:33

AI图像编辑大师:InstructPix2Pix模型完全使用手册

AI图像编辑大师&#xff1a;InstructPix2Pix模型完全使用手册 【免费下载链接】instruct-pix2pix 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/instruct-pix2pix InstructPix2Pix是一款革命性的AI图像编辑工具&#xff0c;它通过简单的文本指令就能实现复…

作者头像 李华
网站建设 2026/6/22 21:42:43

终极GASShooter游戏开发完整指南:快速构建高性能射击游戏

想要快速掌握虚幻引擎4中的GameplayAbilitySystem插件开发吗&#xff1f;GASShooter项目正是你需要的终极解决方案。这个开源项目专为FPS/TPS游戏开发者设计&#xff0c;提供了完整的游戏框架和丰富的功能模块&#xff0c;让你能够快速搭建高性能的多人射击游戏。&#x1f3ae;…

作者头像 李华