1. 普通函数声明/定义
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体
func 函数名(形式参数列表) (返回值列表){
函数体
}
2. 接口定义及实现
接口定义,注意和上述函数声明作区分
type 接口名 interface{
method1(参数列表) 返回值列表
method2(参数列表) 返回值列表
}
实现接口所有方法
func(t 自定义类型) method1(参数列表) 返回值列表{
// 方法实现
}
func(t 自定义类型) method2(参数列表) 返回值列表{
// 方法实现
}
注:Golang中无implement这样的关键字
3. Go Context详解
Go Context通常被称为上下文,在go中,理解为goroutine的运行状态、现场,存在上下层goroutine context的传递,上层goroutine会把context传递给下层goroutine。每个goroutine在运行前,都要事先知道程序当前的执行状态,通常将这些状态封装在一个 context变量,传递给要执行的goroutine中。
通过context包,可以非常方便地在请求goroutine之间传递请求数据、取消信号和超时信息。
4. goroutine调度模型
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的
MPG模式
M:操作系统的主线程
P:协程执行需要的上下文
G:协程
goroutine之间如何进行通讯?
全局变量的互斥锁
使用管道Channel
5. defer、panic和recover
Go 语言的 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源;
panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer;
recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用。
参考博客:Go语言设计与实现
6. import导包时的三种情况
示例代码:
import (
v2 "github.com/YFJie96/wx-mall/controller/api/v2"
_ "github.com/YFJie96/wx-mall/docs"
. "fmt"
"github.com/gin-gonic/gin"
)
(1)v2 :别名, 导入包的一个别名,可以直接使用 “v2.” 调用包内接口或方法
(2)_ :在导入路径前加入下划线表示只执行该库的 init 函数而不对其它导出对象进行真正的导入。因为 Go 语言的数据库驱动都会在 init 函数中注册自己,所以我们只需要进行上述操作即可;否则的话,Go 语言的编译器会提示导入了包却没有使用的错误
(3). :点相当于把导入包的函数,同级导入到当前包,可以直接使用包内函数名进行调用
7. GOPATH详解
参考博客:GOPATH 与 GO Modules
8. Go中的格式化打印“%+v”和“%v”区别
“%+v”会以字段键值对的形式key-value格式打印
“%v”只会打印字段值value信息
参考博客:Go中的格式化打印
9. Const
10. Go语言中的时间处理
昨日0点(格式化)
ts := time.Now().AddDate(0, 0, -1)
timeYesterday := time.Date(ts.Year(), ts.Month(), ts.Day(), 0, 0, 0, 0, ts.Location())
timeStr := timeYesterday.Format("2006-01-02")
fmt.Println(timeStr)
某天的第二天的0点整
nowTimeStr := "2022-02-28"
//使用Parse 默认获取为UTC时区 需要获取本地时区 所以使用ParseInLocation
t2, _ := time.ParseInLocation("2006-01-02", nowTimeStr, time.Local)
towTimeStamp := t2.AddDate(0, 0, 1).Unix()
towTimeStr := time.Unix(towTimeStamp, 0).Format("2006-01-02 15:04:05")
fmt.Println(towTimeStr)
例:
11. Go中Handler
Multiplexer根据URL将请求路由给指定的Handler。Handler用于处理请求并给予响应。更严格地说,用来读取请求体、并将请求对应的响应字段(respones header)写入ResponseWriter中,然后返回。
参考博客:Golang Handler详解
12. Go语言变量作用域、指针
参考博客:Go语言变量作用域、指针、数组