# 技术规范

# flag

# HTTP

Content-Type只会存在于POSTPATCHPUT等请求有请求数据实体时指定数据类型和数据字符集编码, 而GETDELETEHEADOPTIONSTRACE等请求没有请求数据实体

Content-Length则视Content-Type而定,如text/htmltext/javascript等请求数据没有Content-Length

# switch

  • 在Python中没有switch语法

  • JavaScript的switch语法跟Java一样

  • 在Java中

如果default不是switch代码块中最后一个case,请记得用break;结束默认case

switch ("A".toLowerCase()) {
case "a":
    System.out.println("a");
    // 注意:此处如果条件满足但没有添加break,则代码会继续执行,
    // 会无条件执行后面的语句,直到遇到break
    //break;
case "b":
    System.out.println("b");
    break;
default:
    // 如果default写在最前面,会先执行,
    // 但是如果没有写break;还是会无条件执行后面的语句
    System.out.println("default");
    break;
}
  • 在Go中
  1. 左花括号{必须与switch处于同一行;

  2. 条件表达式不限制为常量或者整数;

  3. 单个case中,可以出现多个结果选项,以,分割;

  4. 与C语言等规则相反,Go语言不需要用break来明确退出一个case

  5. 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case

  6. 可以不设定switch之后的条件表达式,在此种情况下,整个switch结构与多个if...else...的逻辑作用等同。

switch strings.ToLower("A") {
case "a":
    fmt.Println("a")
case "b":
    fmt.Println("b")
default:
    fmt.Println("default")
}

# directory和folder区别

  • directory 目录,简称 dir

  • folder 文件夹

两者一般情况下是可以相互通用的,都表示文件夹的意思;但是细细纠来,还是有区别的:

Hi, please go to D:\files\images\directory, and then double click and open folder "travelImg".

  • 看完上面那句话,相信大家有点知道意思了:

directory 也是一个folder,但是我们在说一个directory的时候,通常指它含有路径的意思在里面;

folder 一般情况,是说某一个文件夹,通常不包含路径的意思,比如:双击这个文件夹,在里面找找看。

# 进制

进制 英文 范围 前缀 后缀
二进制 Binary 0-1 0b B
八进制 Octal 0-7 0/0O O
十进制 Decimal 0-9 D
十六进制 Hexadecimal 0-9, A-F 0x H

# 逻辑运算符

运算符 说明
AND 与(&&)
EQ EQUAL等于(==)
GE GREATER THAN OR EQUAL 大于等于(>=)
GT GREATER THAN大于(>)
LE LESS THAN OR EQUAL 小于等于(<=)
LT LESS THAN小于(<)
NE NOT EQUAL不等于(!=)
NOT 非(!)
OR 或(||)

# 字符编码

Unicode 意义
u0024 $
u0028 (
u0029 )
u002A *
u002B +
u002E .
u003F ?
u005B [
u005C \
u005E ^
u007B {
u007C |
u007D }
u0009 t
u000A n
u000D r
u0022 "
u002C ,
u003A :

# GNU风格版本规则

  • MAJOR.MINOR.PATCH即: 主版本号.次版本号.修正版本号

  • Major.Minor.Revision即: 主版本号.次版本号.修正版本号

  1. Major 主版本号:表示当前APR的主版本号,它的变化通常意味着APR的巨大的变化,比如体系结构的重新设计、API的重新设计、 重大的重构、重大的feature改动、重大的不兼容性的变化等等,而且这种变化通常会导致APR版本的向前不兼容。

  2. Minor 次版本号:发布较大的新feature功能,或者较大的重构或者模块变化,或者出现不兼容性改动,会增加子版本号; 子版本的发布会伴随着完整的change log,算是一个较大的版本发布,有仪式感

  3. Revision/PATCH 修正版本号:往往是bug fix,或者增加较小的feature,较小的功能改进或者模块变化, 在保证完整向后兼容的前提下,会增加修正版本号

  4. 当主版本号增加时,子版本号及修正版本号置0

  5. 当子版本号增加时,修正版本号置0

  • 按照测试过程标识
  1. Alpha版:预览版或内部测试版,一般不向外部发布,会有很多Bug。
  2. Beta版:公测版。
  3. RC版:Release Candidate候选版本。也叫做Gamma版本。

# 多线程

并发、并行、同步、异步、多线程、协程的区别

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。无论进程还是线程,都是由操作系统所管理的。

协程(Coroutine)编译器级的,进程(Process)和线程(Thread)操作系统级的,Process -> Thread -> Coroutine

  • 并发

同一时间段有几个程序都处于已经启动到运行完毕之间,并且这几个程序都在同一个处理机上运行,并发的两种关系是同步和互斥;

  • 互斥

进程之间访问临界资源时相互排斥的现象;

  • 同步

进程之间存在依赖关系,一个进程结束的输出作为另一个进程的输入。具有同步关系的一组并发进程之间发送的信息称为消息或者事件;

  • 并行

单处理器中进程被交替执行,表现出一种并发的外部特征;在多处理器中,进程可以交替执行,还能重叠执行, 实现并行处理,并行就是同事发生的多个并发事件,具有并发的含义,但并发不一定是并行,也就是说事件之间不一定要同一时刻发生;

  • 多线程

多线程是进程中并发运行的一段代码,能够实现线程之间的切换执行;

  • 异步

和同步相对,同步是顺序执行,而异步是彼此独立,在等待某个事件的过程中继续做自己的事,不要等待这一事件完成后再工作。 线程是实现异步的一个方式,异步是让调用方法的主线程不需要同步等待另一个线程的完成,从而让主线程干其他事情。

  • 异步和多线程

不是同等关系,异步是目的,多线程只是实现异步的一个手段,实现异步可以采用多线程技术或者交给其他进程来处理

  • 协程

coroutine协程详解

协程

协程,又称微线程,纤程。协程(Coroutine)是一种轻量级的用户态线程,实现的是非抢占式的调度,即由当前协程切换到其他协程由当前协程来控制。 协程本身可以做在用户态,每个协程的体积比线程要小得多,因此一个进程可以容纳数量相当可观的协程

  • 信号量

进程间通信之-信号量semaphore

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。

信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

  • 上下文切换

什么是进程、线程、协程

进程的切换者是操作系统,切换时机是根据操作系统自己的切换策略,用户是无感知的。 进程的切换内容包括页全局目录、内核栈、硬件上下文,切换内容保存在内存中。进程切换过程是由“用户态到内核态到用户态”的方式,切换效率低。

线程的切换者是操作系统,切换时机是根据操作系统自己的切换策略,用户无感知。 线程的切换内容包括内核栈和硬件上下文。线程切换内容保存在内核栈中。线程切换过程是由“用户态到内核态到用户态”, 切换效率中等。

协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序所决定的。 协程的切换内容是硬件上下文,切换内存保存在用户自己的变量(用户栈或堆)中。协程的切换过程只有用户态,即没有陷入内核态,因此切换效率高。

# 线程数量控制

  • IO密集型

线程数 = CPU核心数/(1-阻塞系数)

Blocking Coefficient(阻塞系数)(一般为0.8~0.9之间) = 阻塞时间/(阻塞时间+使用CPU的时间)

  • 计算密集型

CPU有超线程:线程数 = CPU内核线程数*2

CPU无超线程:线程数 = CPU核数+1