Linux 应用软件编程 文件编程(IO)
2026/6/1 21:55:06
// 基本语法func函数名(参数列表)(返回值列表){// 函数体}// 示例funcadd(xint,yint)int{returnx+y}// 简化参数类型(相同类型)funcmultiply(x,yint)int{returnx*y}// 返回多个值funcswap(x,ystring)(string,string){returny,x}// 命名返回值funcsplit(sumint)(x,yint){x=sum*4/9y=sum-xreturn// 裸返回,自动返回x和y}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}// 返回函数的函数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...)}}// ... 表示可变参数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}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}typeCounterstruct{valueint}// 值接收者:不修改原对象,适用于小型结构体func(c Counter)GetValue()int{returnc.value}// 指针接收者:需要修改对象或避免复制大对象func(c*Counter)Increment(){c.value++}// 指针接收者:确保一致性(推荐)func(c*Counter)Decrement(){c.value--}funcprocessFile(filenamestring)error{file,err:=os.Open(filename)iferr!=nil{returnerr}deferfile.Close()// 确保文件被关闭// 多个defer按LIFO顺序执行deferfmt.Println("文件处理完成")deferfmt.Println("清理临时资源")// 处理文件...returnnil}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]}// 返回错误的函数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}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}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]}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),)}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}}// 小函数会被编译器内联funcadd(a,bint)int{returna+b}// 避免复杂函数影响内联funccomplexCalculation(x,yint)int{// 复杂逻辑...returnresult}// 避免在热路径中分配内存funcprocess(data[]byte){// 复用缓冲区varbuf[1024]byte// ... 处理逻辑}// 使用sync.Pool重用对象varbufferPool=sync.Pool{New:func()interface{}{returnmake([]byte,0,1024)},}函数设计原则
错误处理
性能考虑
代码组织