HTML
目录[TOC]
准备
在vscode中安装插件
Chinese (Simplified)
Auto Rename Tag/Auto Close Tag : 前者可以自动重命名配对的HTML/xml标签,后者自动配对HTML/XML标签
open in (default) browser 在浏览器中打开
然后 !+tab 可以生成一个默认的模板
1234567891011<!DOCTYPE html> <!-- 声明HTML5文档,不区分大小写,还有其他html版本 --> <html lang="en"> <!-- 根元素 --> <head> <!-- 包含文档的元数据(meta) --> <meta charset="UTF-8"> <!--声明utf-8编码,不然中文乱码/好吧我实验了一下,这个不写也没事吗,估计是浏览器太牛逼了--> <meta name=" ...
相对路径
就随便记记,反正总是忘记
以“./”开头,代表当前目录和文件目录在同一个目录里,“./”也可以省略不写!
以”../“开头:向上走一级,代表目标文件在当前文件所在的上一级目录;
以”../../“开头:向上走两级,代表父级的父级目录,也就是上上级目录,再说明白点,就是上一级目录的上一级目录
以”/”开头,代表根目录
没了
简单排序算法
选择排序
1234567891011func selectSort(arr []int){ for i:=0 ; i<len(arr)-1 ; i++ { minIndex := i; for j:=i+1 ;j<len(arr);j++ { if arr[minIndex] > arr[j] { minIndex = j } } arr[i] , arr[minIndex] = arr[minIndex] , arr[i] } }
时间复杂度O(n)
冒泡排序
123456789func bubbleSort(arr []int) { for i := 0; i < len(arr)-1; i++ { for j := 0; j < len(arr)-i-1; j++ { if arr[j] ...
时间复杂度
时间复杂度
常数操作: 与数据量没有关系的操作(+-*/和位运算)
根据常数操作数量的表达式,保留最高次,去掉系数,就是时间复杂度
用O(..)表示,时间复杂度越小越好,如果相同,就–实际去跑区分常数项时间
时间复杂度较差,是因为他运用了太多的时间比较行为,比较行为的效率不高,浪费了大量的比较行为才搞定某一个数
额外空间复杂度如果是有限的变量来处理就可以完成算法,就是o(1),如果是需要重新开辟一个数组来完成算法,就是o(n)
递归的时间复杂度计算
master 公式 (子问题规模需要一样)
T(N) = a * T(N/b) + O(N^d)
T(N)指的是母问题的数据量是N级别的
T(N/b)子问题都是(N/b)规模,即每次调用子问题的规模都是一样的
a表示子问题的生成数量
O(N^d)除去调用之外的时间复杂度
如果符合master公式,可以推出下面式子
log ( b , a ) < d 时间复杂度为 O(N^d)
log ( b , a) > d 时间复杂度为 O(N^log(b,a))
log ...
Module实现
在了解了项目结构后,会明白我们往往会在Module后放入用户的功能,但是不同的功能实现涉及不同的理念,在小项目的时候,往往就是一坨功能合在一起,但是功能多起来了的时候,应该怎么实现?
先看看我一开始的代码:
12345678// main.gofunc main(){ r := gin.Default() log.Init() configs.Init() db.Init() routers.RootPath(r)}
1234567// routers.go 自成一个包func RootPath(r *gin.Engine){ rootPath := r.Group("/user"){ r.POST("/register",Register) r.POST("/update",middleware.Auth(),Update) }}
123// 具体功能实现 userupdate.goregister.go...
学习了NX的模 ...
Go好玩的用法(持续更新)
排序:1234nums := []int {2,5,4,8,1,3,9}sort.Slice(nums, func(i,j int)bool{ return nums[i]<nums[j]}) // 升序排序,降序fanzhi
配置文件
引言
123dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%s&loc=%s", "root","123456","localhost","3306","utf8mb4","True","Local" )
上面的行为是非常呆逼的,很生硬,而且一般来说不会吧具体的数值嵌入代码之中,又比如jwt.secretKey,因此就需要使用配置文件
YAML
一款标记性语言,一种较为人性化的数据序列化语言
基本语法
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
相同成绩的元素左对齐
‘#’表示注释
这个文章中用到引用
1234xxxxxx: xxxxxx: xxxxx xxxxxx: xxxxx xxxxxx: xxxxx
Viper
Viper是Go应用程序的完整配置解决方案
支持:
默认配置
从 JSON, ...
ErrorHandling
引言
这篇博客不是关于错误堆栈的实现的,反正我的项目太小用不到(NX的嘲讽)
在Gin框架中,我们往往会直接使用下面形式进行错误处理
123456if err!=nil{ c.JSON(http.statusOK,gin.H{ "msg" : "ok", "error" : err })}
然而,我们会发现这种错误返回的方式,没有固定的结构,并且书写的时候非常冗余
那么我们就需要有一种固定形式来返回错误,同时丰富错误
算了说白了就是把c.JSON封装一下,更加高级一点,下面看一下实现
实现
结构1234errs: - code.go - logic.go - response.go
code.go:预定义字段
123456789101112131415161718192021222324252627package errs// 这个代码是用作特定类型定义//可以预定义一些成功类型和错误类型,以便在整个系统中使用//参照NX的博客,反正就是参照了HTTP状态码的语义,方便识别错 ...
jwt
JWT
JWT - Json Web Token 官网已经讲的很清楚了其实
说白了就是使用某些方法得到一个token,然后通过这个token来验证用户的真假
这边主要介绍JWT来鉴权的知识,一般是作为中间件使用
结构JSON Web 令牌由三个部分组成,由 . 分隔
Header
Payload
Signature
通常表示为 xxxxxxxx.xxxxxxxx.xxxxxxxxx
三个字段都是JSON格式的,然后经过BASE64编码后获得下面这个
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
反正一坨你也看不懂,但是登录一个网址你就可以转换了 JSON Web Tokens - jwt.io
转换出来的格式就是刚才的三个格式
HeaderHeader 由 令牌类型 和 签名算法 组成
{
“alg”: ...
HTTP功能追加协议
HTTP瓶颈
解决HTTP性能瓶颈,缩短Web页面的加载时间 (发音同speedy)
在一些网站上,海量的内容上传浏览更新,为了实时显示这些内容,HTTP的能力有限
下面的HTTP标准就会变成瓶颈
一条连接只能发送一个请求
请求只能从客户端开始,客户端不能接受除响应之外的指令
请求/响应没有压缩就发送,首部信息越大延迟越大
发送冗长的首部,每次互相发送相同的首部造成浪费多
可任意选择数据压缩方式。非强制压缩发送
尝试解决方法
AJax
Comet
SPDY
通过在 TCP/IP 的应用层与运输层之间增加 新的会话层,并在通信的过程中使用SSL
HTTP 应用层
SPDY 会话层
SSL 表示层
TCP 传输层
多路复用流通过单一TCP连接,无限制处理多个HTTP请求
所有请求在一条TCP上完成,因此处理效率得到提高
赋予请求优先级给无限制的请求逐个分配优先级顺序
为了解决因带宽低而导致响应变慢的问题
压缩HTTP首部通信产生的数据包数量和字节量减少
推送功能支持服务器主动向客户端推送数据
服务器提示功能服务器主动提示客户端请求 ...