io/ioutil
- 实现I/O实用函数
- ioutil.ReadAll()
go mod
gin.context
-
gin框架中重要的结构体,从对象池中获得。
-
作为一个数据结构在中间件中传递本次请求的各种数据、管理流程,进行响应。
-
封装了http.Request,url里面的参数。用来响应的ResponseWriter。参与的处理者。
-
Engine结构体
json.Marshal
- json.Marshal:将数据编码成json字符串
json.Marshal(student):将数据结构实例student转化为json串,返回转化后的json和错误信息
jsonStu, err := json.Marshal(student)
转化失败时err!=nil,jsonStu是[]byte类型。
例:
type Stu struct{
Name string 'json:"name"' //变量旁用json标签,转化成json时key就用指定的标签,否则取变量名。
Age int
sex string //首字母没大写,不可导出为json
Class *Class 'json:"class"'
}
type Class struct{
Name string
Grade int
}
fun main(){
stu := Stu{
Name := "李",
Age := 18,
sex := "女",
}
//指针变量
cla := new(Class)
cla.Name = "1班"
cla.Grade = 3
stu.Class = cla
jsonStu, err := json.Marshal(stu)
if err != nil{
fmt.Println("转化错误")
}
//jsonStu是[]byte类型
fmt.Println(string(jsonStu))
}
//结果
{"name":"李","Age":18,"class":{"Name":"1班","Grade":3}}
上面的成员变量都是已知的类型,只能接收指定的类型,比如string类型的Name只能赋值string类型的数据。
但有时为了通用性,或使代码简洁,我们希望有一种类型可以接受各种类型的数据,并进行json编码。这就用到了interface{}类型。
interface{}是个空接口,go的每一种类型都实现了该接口,因此任何其他类型的数据都可以复制给interface{}类型。
- 实际项目中编码成json的数据结构往往是切片类型(简化版动态数组)
var stu1 []* StuRead
new()只能实例化对象,不能用于切片,切片类型
json.Unmarshal
-
将json字符串解码到相应的数据结构。
-
第一个参数json字符串,第二个参数是接受json解析的数据结构(必须是指针)。
stu := StuRead{} //先创建数据结构接受解析后的数据 //也可以直接stu = new(StuRead) ,此时stu就是指针 err := json.Unmarshal(str, &stu) //如果json串格式不对就报错
对于json中的复合结构(例如 ”class“:{“name”:“1”, “grade”:“1”}),不是可以直接解析的简单类型数据。并且结构中的Class是interface{}类型,那么解析时json自动将复合结构的数据解析为map[string]interface{}类型的项。
【参考文档】Go的json解析:Marshal与Unmarshal
go get ssh/https
- HTTPS 只能 clone 公开的仓库,且还得输入用户名密码(虽然可缓存)
- SSH 可 clone 公开仓库,也可 clone 你自己的私人仓库
-
go get本质:在 Go 1.13 中 go get 根据当前目录或父目录是否存在 go.mod 文件而有 2 种含义:
有 go.mod 时:默认启用 module 模式
无 go.mod 时:默认按原来的 GOPATH 模式
这也就是为什么有些 go get 能成功,有些 go get 失败的原因:module 模式时,默认会从 go env 中的 GOPROXY 模块代理中获取模块源码 -
配置.gitconfig,使https——>ssh
git config --global url."git@git.code.oa.com:".insteadOf "https://git.code.oa.com/"
-
配置.ssh\config host git.code.oa.com ProxyCommand none
-
~/.ssh里私钥不存在(把id_rsa放进去)
内网/外网/NAT
- tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:
10.0.0.0/8:10.0.0.0~10.255.255.255
172.16.0.0/12:172.16.0.0~172.31.255.255
192.168.0.0/16:192.168.0.0~192.168.255.255
使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。因为本网络中的保留地址同样也可能被其他网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。
内网IP对Internet的访问必须通过代理的方式,NAT(网络地址转换)技术是基于TCP层面的代理,能够相当好地使用于各种IP服务应用,因此被广泛应用。
内网也叫局域网,从范围上来讲内网就是小部分的网络,一般指的是特定环境下组成网络,比如某一个家庭多台计算机互联成的网络,也可以学校和公司的大型局域网,内网是不能直接连接外网,比较封闭,但在内网里面可以实现文件管理,应用软件共享、打印机共享等服务。
外网又被叫做互联网,是连接不同地区局域网或者城域网计算机的通信的远程网络。通常可以跨接很大的物理范围,覆盖的范围可以是几十公里到几千公里,它能连接多个地区、城市和国家提供远距离通信,形成全球性的互联网络。
互联网地址访问内网终端设备很麻烦,想要访问需要做端口映射。
端口映射就是將外网主机的IP地址的一个端口映射到内网中的一台设备,提供相应的服务。当用户访问这个IP这个端口时,服务器自动将请求映射到对应局域网内部的终端设备上。
NAT(Network Address Translation):NAT主要功能是可以在内网配置私有IP地址,然后在路由或者防火墙等边界设备上统一转换为公网地址在访问互联网(利用路由器上的外网地址),这样就不需要为局域网内的每台终端设备配置公网IP地址,解决了公网IPV4地址枯竭的问题。
路由器内维护NAT转发表,使得多个内网ip可以公用一个公网ip。
如图内网的私有IP地址和端口经过NAT转换,换成了公网的IP地址和一个随机的端口。这样,40.30.20.10:80接收到12.13.14.15:24604的请求后,返回消息给12.13.14.15:24604,也就是路由器接收到回报,根据回报中的IP和端口信息(12.13.14.15:24604)去查找NAT转发表,找到对应的192.168.1.3:42301,然后将回报转发给192.168.1.3:42301。其他设备上网用同样的流程。有了这么个NAT转发表,家庭网络中不同设备(IP)不同程序(port)可以公用路由器上的一个公网IP地址了。家庭网络和办公网络公用IP,大大减少了IPv4的消耗。
NAT工作原理
IDC
- 互联网数据中心,互联网数据流通的枢纽,为用户提供高速的数据传输服务和数据接入服务。
- 是实体服务器的集群。这是随着互联网发展而兴起的服务器托管、租用、运维以及网络接入服务的业务。通过IDC服务,企业或政府单位无需再建立自己的专用机房、铺设昂贵的通信线路,也无需聘请网络工程师,即可解决互联网应用的许多专业需求。通俗的讲呢,就是机房+服务。
时序数据库
-
时序数据库是基于时间的一系列的数据,在有时间的坐标中将这些数据点连成线,存放时序数据的数据库,支持时序数据的快速写入、持久化、多维度的聚合查询等基础功能。
-
基本概念:
metric: 度量,相当于关系型数据库中的table。
data point: 数据点,相当于关系型数据库中的row。
timestamp:时间戳,代表数据点产生的时间。
field: 度量下的不同字段。比如位置这个度量具有经度和纬度两个field。一般情况下存放的是会随着时间戳的变化而变化的数据。
tag: 标签,或者附加信息。一般存放的是并不随着时间戳变化的属性信息。timestamp加上所有的tags可以认为是table的primary key。
对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了所有的历史数据,时序数据库的查询也总是会带上时间作为过滤条件。所有有时序数据产生,并且需要展现其历史趋势,周期规律、异常性的,进一步对未来做出预测分析的,都是时序数据库适合的场景。
- 数据存储,LSM tree