nvm使用指南
nvm是node.js的版本管理工具,可以快速的进行node不同版本间切换
安装nvm
windows 下载地址:https://github.com/coreybutler/nvm-windows/releases/download/1.1.7/nvm-setup.zip
一路下一步安装即可
安装好之后执行nvm version
可看查看nvm
版本
1 | PS C:\Users\hajnx> nvm version |
菩提树下改bug的博客
nvm是node.js的版本管理工具,可以快速的进行node不同版本间切换
windows 下载地址:https://github.com/coreybutler/nvm-windows/releases/download/1.1.7/nvm-setup.zip
一路下一步安装即可
安装好之后执行nvm version
可看查看nvm
版本
1 | PS C:\Users\hajnx> nvm version |
[TOC]
Markdown
是什么?
轻量级的纯文本标记语言,通过简单的标记,使得普通文本内容具有一定的格式。
Markdown
的有哪些优点?
markdown
文档html
和pdf
Markdown
的不足?
defer中如果引用了函数的返回值,则因引用形式不同会导致不同的结果。
下面来看三个示例:
1 |
|
想想看最终会输出什么呢?
Go语言中提供了3种数据结构可以让用户管理集合数据:数组、切片和映射。这3中数据结构时语言核心的一部分。其中数组则是切片和映射的基础数据结构。
在Go语言中,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块。数组存储的类型可以时内置类型,如整型或者字符串,也可以是某种结构类型。
数组占用的内存是连续分配的,由于内存连续,CPU可以把正在使用的数据缓存更久的时间,且容易计算索引,可以快速迭代数组里的所有元素。数组的类型信息可以提供每次访问一个元素时需要在内存中移动的距离。
为什么类型可以提供移动距离?并没有想清楚,希望以后可以得到答案
声明数组的基本语法格式如下
1 | var variable_name [SIZE] variable_type |
声明数组时需要指定内部存储的数据的类型,以及需要存储的元素的数量,也就是数组的长度。
1 | // 声明一个包含5个元素的整型数组 |
在Go语言中,声明变量时总会使用对应类型的零值来对变量进行初始话,数组也不例外。当数组初始化时,数组内的每个元素都初始化为对应类型的零值。 如上声明的5位整型数组,其每个元素都会被初始化为0,也就是整型的零值。
1 | // 声明一个5为整型数组,并用具体值初始化每一个元素 |
如果是用...
代替数组长度,Go语言会根据初始化时数组元素的数量来确定该数组的长度。
1 | // 声明一个整型数组,用具体值初始化每一个元素,数组长度由初始化值的数量确定 |
如果知道数组的长度,并且准备个特定位置的元素指定具体值,可以使用如下方法
1 | // 声明一个5位整型数组,用具体值初始化下标为1,3的元素 |
要访问数组里单独的元素,需要使用[]
运算符。
1 | // 声明一个5为整型数组,并用具体值初始化每一个元素 |
声明一个所有元素都是指针的的数组,使用*
运算符就可以访问元素指针所指向的值
1 | var arr4 = [5]*int {1:new(int),3:new(int)} |
Go语言中,数组是一个值,可以用在赋值操作中,变量名代表整个数组,同样类型的数组可以赋值给另一个数组
1 | var arr5 [5]string |
复制之后两个数组的值完全一样。
数组的类型包括数组长度和每个值的类型,只有这两个部分完全一样,才是类型相同的数组,才可以相互赋值。编译器会阻止不同类型的数组相互赋值。
复制指针数组,只会复制指针的值(内存地址),而不会复制指针所指向的值。
声明方式
1 | var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type |
如声明3维数组
1 | var threedim [4][3][3]int |
访问多维数组的元素
1 | threedim[2][2][1] = 3 |
和一维数组一样,只要类型一致,多维数组也可相互赋值
从内存和性能的角度来看,在函数间传递数组是一项开销很大的操作。go语言在函数间传递变量时,总是以值的方式传递的。如果这个变量是一个数组,意味着整个数组,不管有多长,都会完整复制并传递给函数。为了更有效的利用内存和更好的性能,可以在传递时只传递指向数组的指针。但是,如果改变指向指针的值,会改变共享的内存。此时,使用切片可以更好的处理这类共享问题。
Go语言本身就集成了测试工具,不需要单独下载测试类库就可以使用,大大降低了编写测试的门槛
TDD大法好,一直测试一直爽
~
单元测试是用来测试包或者程序的一部分代码或者一组代码的函数。
测试包括正向测试和负向测试,但都是为了保证代码的行为是符合预期的
Go语言里有以下几种写单元测试的方法:
基础测试 basic test
只使用一组参数和结果来测试一段代码
表组测试 table test
使用多组参数和结果进行测试
模仿 Mock
使用一些方法来模仿测试代码需要使用到的外部资源
_test.go
结尾的文件是测试文件。Test
开头testing.T
类型的指针example:
1 |
Tips: 输入时用到的√和×
1
2
3 > const checkMark = "\u2713"
> const ballotX = "\u2717"
>
首先创建一个helloworld.go
文件
1 | package main // 包 表明代码所在的模块 |
执行下方命令运行这个文件(在代码同级目录下运行)
1 | go run helloworld.go |
我们就完成了一个通过go语言实现的helloworld程序
通过这个程序我们来看一些go语言的基本程序结构
一个可执行的go文件也就是应用程序的入口需要具备以下条件:
main
包 : package main
(文件夹不一定是main)main
方法: func main()
main.go
Go语言在main方法中不能return,需要通过os.Exit()
来输出退出状态码
os.Args
获取命令行参数1 | package main // 包 表明代码所在的模块 |
执行下列命令
1 | go run helloworld.go params |
得到结果
1 | Hello World |
xxx_test.go
func TestXXX(){}
1 | // Fibonacci数列:每一位等于前两位之和 |
1 | package fib |
与其他语言差异
赋值可以进行自动类型推断
一个赋值语句中可以对多个变量同时进行赋值
两个变量交换不需要通过中间变量a,b=b,a
即可
常量快速设置连续值 (通过iota常量计数器,只能在常量的表达式中使用)
1 | const ( |
1 | - bool |
go 语言不允许隐式类型转换
别名和原有类型也不能进行隐式类型转换
不支持指针运算
string是值类型,默认是空字符串,而不是nil
预定义值
1 |
attributes是html dom的属性无序集合 ,当我们需要获取一个元素的相关属性信息而知不道从何入手时,可以通过这个集合来获取
例如 : 我在监听form表单中的所有select,当某个select发生变更时,读取这个select的一个属性来动态实现一个操作,比如下拉联动
如果你监听的是一个明确的select,是不需要绕这个弯路的,但是在一些情况下select是动态添加的,监听时也是不明确的,则需要用到attributes来获取发生变更的节点的相关信息
使用方法也很简单:
1 | // elem 是一个dom对象 |