Map和MutableMap:键值对集合
记一个关于Map的知识kotlin中有Map和MutableMap两种 Map是一个接口和通用的元素集合。 Map以键和值对的形式保存数据。 映射的键是唯一的,每个键只保留一个值。 键和值可以是不同类型。 也被分为可变的和不可变的,即Map与MutableMap. Map它是不可变的,它的大小固定,方法支持只读访问。要使用Map接口,需要使用mapOf()或mapOf <k,v>()函数声明。他的常用方法:getValue(key) 它返回给定键的值,如果映射中没有这样的键,则抛出异常。getOrDefault(key,defaultValue) 获取指定key值的value,没有值时返回默认值contains(key)、containsKey(key) 它检查在Map中是否包含给定的键。minus(key) 返回去除该 key-value的mapplus(pair) 向map中添加key - value但这些方法不能对原Map产生改变。需要改变的话需要使用 1map = map.plus(a to...
WebSocket:双向通信,弥补HTTP不足
WebSocket是一个在单TCP连接上进行全双工通信的协议。允许服务器主动向客户端推送消息。 WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。 HTTP 协议有一个缺陷:通信只能由客户端发起,不具备服务器推送能力。所以进行双向通信时必须使用webSocket。 这种单向请求的特点,注定了如果服务器由连续的状态变化,客户端想要获知会非常麻烦。我们只能使用“轮询”:每隔一段时间,就像服务器发送要给请求。而轮询的效率非常的低。浪费资源。 轮询的危害:服务端被迫维持来自每个客户端的大量不同的连接大量的轮询请求会造成高开销,比如会带上多余的header,造成了无用的数据传输。 websocket是先通过HTTP协议完成第一次握手他们的握手过程 12345678GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key:...
Shell脚本中的表达式和流程控制
表达式运算符$(())或者$[]都可以用来在内部写表达式,运算操作符。 判断语句[ condition ](condition前后要有空格)非空返回true判断字符串相等,用=。 12345678910111213141516if [ "ok" = "ok" ]then echo 'equal"elif [ 条件判断式 ]thenfi## case语句case $变量 in"变量1")执行命令;;"变量2")执行命令2;;esac for循环123456789101.for 变量 in 值1 值2 值3.。。do程序/代码done2.for(( 初始值;循环控制条件;变量变化))do程序/代码done while循环1234while [ 条件判断式 ]do 程序done 读取控制台输入read (选项)(参数)-p:指定读值时的提示符。-t:指定读取值时等待的秒数。如果一定时间内没输入,就退出。 12read -p "请输入一个数Num1="...
Shell脚本:命令解释和脚本编写
shell是一个命令解释器,用来向内核发送请求。通过写shell脚本,通过shell执行。(bashshell) 脚本格式#!/bin/bash开头脚本要有执行权限。或者使用sh来执行脚本,他可以不需要执行权限。sh hello.sh 定义变量A=100调用该变量时需要使用$ 1234567891011121314A=100echo A=$Aecho "A=$A"#这两个的输出结果是一样的。都是A=100#只有$A才会被解析#撤销变量unset A#声明静态变量#只会定义一次,不会被反复初始化。而且不能被unsetreadonly B=2#在shell中,等号两侧不允许又空格## 将命令的返回值返回出去A=`data` or A=$(data)#其中data是命令。 定义全局变量export。可以在/etc/profile中写入。然后通过source命令刷新。也可以部分权限。写入bashrc中也可以所谓全局变量,就是指变量在当前的整个 Shell 进程中都有效。每个 Shell 进程都有自己的作用域,彼此之间互不影响。在...
作用域链与变量声明
作用域及作用链 全局作用域; 函数作用域; 块级作用域; 全局作用域全局作用域的变量可以在程序任意位置访问到。 123456var greeting = 'Hello World!';function greet() { console.log(greeting);}// 打印 'Hello World!'greet(); 函数作用域函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问。 块级作用域ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中.在大括号之外不能访问这些变量。 12345678910{ // 块级作用域中的变量 let greeting = 'Hello World!'; var lang = 'English'; console.log(greeting); // Prints...
nginx 部署前后端错误记录
记录两个错误1在我部署了一个前端页面到服务器上的nginx后,我访问他报错403.显示没有权限。后来发现403的一个可能原因是因为nginx没有权限访问到/root中的内容。因为我把vue打包的页面直接放到了root目录下。因此报错,只要将这个dist文件放到其他位置即可正常访问了 2vue部署了路由的话,再部署到nginx上需要为vue的路由专门配置 12345location / { root html/dist; index index.html; try_files $uri $uri/ /index.html;#解决页面刷新 } 同时因为vue的代理服务器只在运行时才有用。因此需要再nginx部署代理服务器。或者再后端解决跨域问题。这里介绍再nginx解决代理的方法。 123456789101112location /api/ { # 单个服务 proxy_pass...
路由守卫栈内存溢出处理
路由补充RangeError: Maximum call stack size报以上错误。其大意是说栈内存溢出。以下是我写的代码 12345router.beforeEach((to,from,next)=>{ if(!localStorage.getItem("token")){ next("/login") }}) 现在分析一下。假设他跳转到login页面,然后他会判断是否有token,判断完成,他将眺望login页面。跳转之后他又会进行判断是否又token 因为他不是next(),按照他的流程接着跳转。而是采用了next(“/login”),表示他会重新发起一次跳转,也就是会再过一遍路由守卫。因此他会堆栈溢出而报错。修改后的代码可以改为 123456789router.beforeEach((to,from,next)=>{ if(to.path==="/login"){ ...
Get-Post请求参数区别
主要解决问题为get请求,post请求,params参数,data参数的区别和联系。 首先Get请求不能携带请求体,服务器接收到Get请求后,会默认忽视掉Get请求的请求体。也就是Get请求只能携带params参数,这个参数会直接跟在请求地址后面,组成一个字符串。 post请求既可以使用params请求,也可以携带data参数,data的参数会放在payload中。springboot需要获取post发送的payload需要通过@RequestBody来获取。
路由模式:hash与history
hash模式,history模式hash模式:他不会像服务器发送hash值,也就是#后面的内容不会发送到服务器中。history模式:会将路径内容发送到服务器中
路由守卫:全局、独享、组件内
路由守卫需要在路由中进行配置 全局路由前置1234567全局前置路由守卫//切换路由或者初始化的时候都会调用一次//to:前往的地址。from:过来的地址。next:是否允许前往,调用后即放行route.beforeEach((to,from,next)=>{ next()//允许放行}) 可以在路由中的meta属性中添加属性。来选择那些路由需要鉴权。哪些不需要鉴权。 后置1234567全局前置路由守卫//切换路由或者初始化的时候都会调用一次//to:前往的地址。from:过来的地址。next:是否允许前往,调用后即放行route.afterEach((to,from)=>{ }) 独享路由守卫在每个子路由内使用beforeEnter: (to,from,next)=>{}他的逻辑和全局路由守卫一样,但是他只写在单个子路由内。而且独享路由守卫只有前置路由守卫。 组件内路由守卫