1. 函数
1-1 Main函数
每个Go语言程序都应该有个main package; Main package 里的main函数是Go语言程序入口
//一种常见的main写法
package main
import (
"flag"
"fmt"
"os"
)
//通过name 作为参数,在执行main函数的时候, --name canshu 传参
func main(){
name := flag.String("name", "working","say hi")
flag.Parse()
fmt.Println("os args is:", os.Args)
fmt.Println("input parameter is ", *name)
}
1-2 Init函数
- Init函数:会在包初始化时运行
- 谨慎使用Init函数
- 当多个依赖项目引用统一项目,且被引用项目的初始化在Init中完成,并且不可重复运行时,会导致启动错误。
1-3返回值
- 多指返回
- 函数可以返回任意数量的返回值
- 多返回值的应用场景?错误处理
- 命名返回值
- Go的返回值可以被命名,他们会被视作定义在函数顶部的变量。
- 返回值的名称应当具有一定的意义,它可以作为文档使用
- 没有参数的return 语句返回已命名的返回值。也就是直接返回
func DupString(input string)(err error, result string) {
if input == "成立" {
err = fmt.Errorf("错误结果")
return
}
result = 1 + 3
return
}
1-4传递变长参数
Go语言中的可变长参数允许调用方传递任意多个相同类型的参数
- 函数定义
- func append(slice []type, elems ...Type)[]Type
- 调用方法
-
myslice := []string{} myslice = append(myslice,"a","b","c")
-
1-5回调函数(Callback)
-
函数作为参数传入其他函数,并在其他函数内部调用执行
func main(){ DoOperation(1, increase) } func increase(a,b int){ println("increase result is:", a+b) } func DoOperation(y int, f func(int,int)){ f(y, 1) }
1-6 闭包
- 匿名函数
- 不能独立存在
- 可以赋值给其他变量; x:= func(){}
- 可以直接调用; func(x, y int){println(x+y)}(1,2)
- 可作为函数返回值; func Add() (func (b int) int)
- 使用场景
-
defer func() { if r:= recover(); r!= nil { println("recover in FunX') } }()
1-7 方法
- 作用在接收者上的函数
- 使用场景
- 很多场景下,函数需要的上下文可以保存在receiver属性中,通过定义receiver的方法,该方法可以直接访问reveiver属性,减少参数传递需求
-
func (recv receiver_type) methodName(Paramter_list){return value_list} func (s *Server) StartTLS(){ if s.URL != "" { panic("") } if s.client == nil { s.client = &http.Client(Transport: &http.Transport){}) } }