六灶网站建设,上海网站seo诊断,织梦网站开发兼职,优秀高端网站建设企业一、函数基础
1.1 函数声明
// 基本语法
func 函数名(参数列表) (返回值列表) {// 函数体
}// 示例
func add(x int, y int) int {return x y
}// 简化参数类型#xff08;相同类型#xff09;
func multiply(x, y int) int {return x * y
}1.2 多返回值
// 返回多个值
func…一、函数基础1.1 函数声明// 基本语法func函数名(参数列表)(返回值列表){// 函数体}// 示例funcadd(xint,yint)int{returnxy}// 简化参数类型相同类型funcmultiply(x,yint)int{returnx*y}1.2 多返回值// 返回多个值funcswap(x,ystring)(string,string){returny,x}// 命名返回值funcsplit(sumint)(x,yint){xsum*4/9ysum-xreturn// 裸返回自动返回x和y}二、函数类型与高级特性2.1 函数作为值funcmain(){// 函数赋值给变量add:func(x,yint)int{returnxy}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{sumxreturnsum}}funcmain(){pos,neg:adder(),adder()fori:0;i10;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{totalnum}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 延迟执行deferfuncprocessFile(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){ifb0{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)processorupper fmt.Println(processor.Process(hello))// HELLO}5.2 回调函数模式typeFilterFuncfunc(int)boolfuncfilter(numbers[]int,fn FilterFunc)[]int{varresult[]intfor_,n:rangenumbers{iffn(n){resultappend(result,n)}}returnresult}funcmain(){numbers:[]int{1,2,3,4,5,6,7,8,9}// 偶数筛选even:filter(numbers,func(nint)bool{returnn%20})// 大于5筛选large:filter(numbers,func(nint)bool{returnn5})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.hosthost}}funcWithPort(portint)Option{returnfunc(s*Server){s.portport}}funcWithTimeout(timeout time.Duration)Option{returnfunc(s*Server){s.timeouttimeout}}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;i0;i--{nextmiddlewares[i](next)}returnnext}}七、性能考虑7.1 内联优化// 小函数会被编译器内联funcadd(a,bint)int{returnab}// 避免复杂函数影响内联funccomplexCalculation(x,yint)int{// 复杂逻辑...returnresult}7.2 内存分配// 避免在热路径中分配内存funcprocess(data[]byte){// 复用缓冲区varbuf[1024]byte// ... 处理逻辑}// 使用sync.Pool重用对象varbufferPoolsync.Pool{New:func()interface{}{returnmake([]byte,0,1024)},}总结要点函数设计原则保持函数简短建议不超过50行单一职责原则良好的命名和文档错误处理使用多返回值处理错误尽早返回错误提供上下文信息性能考虑小函数有利于内联避免不必要的内存分配合理使用指针接收者代码组织相关函数分组使用接口抽象行为遵循Go惯用模式