go gin 项目笔记

317 阅读3分钟

1.go 格式化输出

Print: 输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v) fmt.Print(str) Println: 输出到控制台并换行 fmt.Println(tmp) Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量 fmt.Printf("%d",a) Sprintf:格式化并返回一个字符串而不带任何输出。 s := fmt.Sprintf("a %s", "string") fmt.Printf(s) Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout。 fmt.Fprintf(os.Stderr, “an %s\n”, “error”)

2. gin mode 选择

代码InitRouter()中

gin.SetMode(utils.AppMode) // utils.AppMode string

gin 框架设置了三种模式:

const (
    // DebugMode indicates gin mode is debug.
    DebugMode = "debug"  // 开发环境
    // ReleaseMode indicates gin mode is release.
    ReleaseMode = "release" // 生产环境
    // TestMode indicates gin mode is test.
    TestMode = "test" // 测试环境
)

3.jwt

使用jwt-go实现jwt签名与验签。

jwt 就是一个令牌。客户端有了这个令牌, 就可以拿着它去服务端获取一些资源。

与token相似 token:

Authorization eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

jwt格式:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

image.png 通过jwt.io/ 解密,一长串字符由3个部分组成(被两个"."分成了3个部分) 第一部分是header,是一个json字符串,描述了自己是什么和生成的算法。比如这里的header表示这是 jwt 并且使用了 HS256 签名算法。这一串字符是经过base64编码后的结果。

第二部分是 payload, 也就是令牌的内容, 也是一个json字符串。这里面具体有什么字段是可以自定义的, 在后面我会详细介绍一般jwt都有哪些字段。大家这里只要知道这是令牌的内容就行了。

第三部分是签名。所谓签名, 就是对第二部分的payload进行取哈希值。由于哈希函数具有 单向性和 很强的方碰撞性,所以可以防止有人串改第二部分的 payload。

当接受jwt的一方需要对签名进行验证, 这个过程叫做验签。只有经过验签的jwt才是有效和真实的。

jwt的签名和验签都需要密钥的参与,要不然谁都可以生成一个 jwt, 服务端无法确认 jwt 的真实性,也就无法使用了。

4.sql语句

select * from 表;查询出表中所有数据,性能比较差; select 常量 from 表;查询出结果是所有记录数的常量,性能比较高; 如果要判断是否有结果使用select 1,如果要返回数据,使用select * ;

image.png

select count(*) from teacher; //11
select count(1) from teacher;  //11
select count(id) from teacher;  //8 不包含null列,但是包含空字符串列
select count(name) from teacher;  //10
select count(address) from teacher; //11
一般情况下,Select Count (*)和 Select Count(1)两者返回结果是一样的,返回结果数目。
如果表中没有主键,使用count(1)比count(*)快;
如果有主键,那么count(主键)最快;
count(*)和count(1)的结果一样,都包括对NULL的统计,而count(字段) 不包括NULL的统计,但是包含空字符串列。
select a.* from a 和 select * from a 区别:避免多表查询时,a,b 两个表都有name字段的时候混淆