代表这个go文件是属于哪一个包,这条语句是必须写的,由于go是以package的形式管理源文件的
引入当前文件依赖的包,包的路径只能够是相对路径,eg:"xxx/decorator",go查找包的过程是先在$GOROOT/src($GOROOT是go的安装路径,默认在/usr/local/go下)文件夹下找,若是找不到就从$GOPATH/src($GOPATH是go工做空间路径,当前工做代码所在的go文件夹路径)文件下找。
var test int = 123
var test bool = true
var test string = "abc"
var test [2]int test[0] = 6 test[1] = 8
// 添加元素方式一 var test = make([]string, 0) test = append(test, 2) // 添加元素方式二 var test = make([]string, 2) test[0] = "123" test[1] = "456"
type TestA struct { c int } type Test struct { a int b string c int TestA } var test = Test{6, "aa", 8, TestA{3}} // 或者不初始化:var test Test
test := make(chan int) go func(){ test <- 1 }() fmt.Printf("aaa: %+v", <-test)
type Test interface{ Say() } type TestA struct{} func (a TestA) Say(){ fmt.Printf("hello") } var testa TestA var test Test test = testa // 接口类型,
var testPtr *int // 定义了没有分配到任何变量时,为空指针
// 方式一 var test = make(map[string]string) test["a"] = "123" // 方式二 var test = map[string]string{} test["a"] = "123" // 方式三 test := make(map[string]string) test["a"] = "123"
初始化一些全局变量,供所属包或者全部包调用git
属于main包,是程序的入口,和main包是一一对应的关系。github
业务子逻辑,处理客户端的GET、POST、PUT、DELETE等请求,get请求使用url库对请求参数进行解析,跟它相关的几个方法是:DefaultQuery、Query、QueryArray,;GET、POST、PUT、DELETE请求的话使用的是gin框架的model binding模型,相关的几个方法是:BindWith、BindJSON、Bind、它们底层都使用了MustBindWith这个方法, 这个方法接收两个参数,一个是要解析的struct(ps:解析的对象必须是struct或者是指向struct的指针),另外一个是binding,由跟Bind相关的几个函数指定,指定的方式区别以下:json
逻辑处理完成,须要使用context.JSON(关键:json.Marshal)或context.HTML(ps: 分别接收三个参数:状态码、模版路径、模版数据)将结果返回给客户端。数组
和异常处理相关的几个关键字:defer(return的时候执行)、recover(捕捉异常)、panic(err)(抛出异常),须要注意的地方是若是子协程不捕捉处理异常,就会报到主线程,由主线程处理,可是子协程会异常退出。缓存
func example () { defer func() { if err := recover(); err != nil { fmt.Printf("error: %+v", err) } else { fmt.Printf("抛出了一个nil") } }() // panic(nil) // 结果:抛出了一个nil panic("fail") // 结果: error: failed }
// 无缓冲通道 func example () { test := make(chan int) go func(){ test <- 1 }() fmt.Printf("channel value: %+v", <-test) } // 执行结果 channel value: 1 // 缓冲通道 func example () { test := make(chan int, 2) go func(){ for i := 0; i < 2; i++ { test <- i } close(test) // 很重要,须要手动关闭,要否则会形成死锁 }() for ch := range test { fmt.Printf("channel value: %+v", ch) fmt.Println("") } } // 执行结果 channel value: 0 channel value: 1
func example () { var wg sync.WaitGroup for i := 0; i < 2; i++ { m := i // 考虑到主线程释放控制权以后协程才执行,缓存i wg.Add(1) go func(){ defer func(){ fmt.Println("ending...") wg.Done() }() fmt.Println(fmt.Sprintf("当前循环到哪里了: %+v", m)) }() } fmt.Println("example...") wg.Wait() } // 执行结果 example... 当前循环到哪里了: 0 ending... 当前循环到哪里了: 1 ending...