C++引用的秘密
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
0. 一个错误的概念123456int main() { int a = 111; int &b = a; b = 222; std::cout<<&a<<&b;}
我们能看到这里输出的两个值相同。
错误1:
很多人认为这里的b就是a,a就是b,a和b的地址是一样的,如下图。
但是笔者要说,其实这个概念是有问题的,a是a,b是b,a和b并不是同一个地址。
1. 从STD的tie类型说起笔者在阅读ClickHouse源码的时候发现了有趣的现象,该源码中有如下代码,我们注意第7-9行,可以发现这使用了STD的tie,该类型让C++实现了一次性返回两个值的效果。下面的executeQueryImpl函数返回了两个值,分别写入到了ast和streams中。
12345678910111213141 ...
Springfox使用
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. 对List不能很好的支持1.1. 核心代码代码中写的是数组
12345/** * 用户 */@ApiModelProperty(value = "用户",example = "hellowang")private List<String> user;
1.2. 问题详情在swagger页面展示的例子是字符串
123{ "user": "hellowang"}
1.3. 问题讨论 Stackoverflow
Github
1.4. 解决方案springfox-collection-example-plugin
Go入门-常见陷阱
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. Go 的指针Go的指针和C的指针很类似,这也是Go被归类于C类语言的原因,Go的指针不支持偏移运算,即不能向C一样让指针+1,-1。
1.1. 正常使用先来看第一个,符号&即可取到对象的地址。
1234567func sample1() { arr1 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} fmt.Println(arr1) fmt.Println(&arr1)}
12[0 1 2 3 4 5 6 7 8 9]&[0 1 2 3 4 5 6 7 8 9]
1.2. for循环问题下面的输出全是9,因为for循环的value是共用一个地址的。
1234567891011121314func sample2() { arr1 := []int{0, 1, 2, 3 ...
Go进阶-Module
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. Module使用在文章Go入门-Go语言从入门到进阶实战中,我们介绍了GO项目的结构,但是没有解释其中的一个文件go.mod, 这其实是模块的意思。在go.mod中可以引入go的依赖。
123456require ( github.com/golang/mock v1.4.4 github.com/golang/protobuf v1.4.3 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/stretchr/testify v1.6.1)
这里简单介绍一下,注意到这里是库名加版本号。当我们引入了依赖管理以后,就可以在自己的项目中直接import三方包了。
2. Module 的历史
Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,Go1.14 上已经明确建议生产上使用了
一开始 ...
Go入门-Effective-Go
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. Effective GOhttps://github.com/bingohuang/effective-go-zh-en
2. 格式化在最开始学习GO的时候,写了几篇Blog,发现代码里面的对齐都是TAB,这让我很困惑,知道现在才知道,GO语言,默认使用TAB进行对齐。
当然GO还有自己的空格规则x<<8 + y<<16,向这份代码,我们根据空格就能知道计算的优先级了。
3. 注释3.1. 包注释Go语言要求package语句前加上注释,来介绍整个包,如果package包含多个文件,则只需要在其中一个文件中标注即可。
1234567891011121314151617181920/*Package regexp implements a simple library for regular expressions.The syntax of the regul ...
Go进阶-Web框架
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
0. 前言简单介绍Beego和Gin,水一水文章。
1.1. 安装Beego库1go get github.com/astaxie/beego
同时安装Bee工具
1go get github.com/beego/bee
看到如下内容代表安装成功
12345678910111213141516171819202122232425262728293031323334353637383940414243444546s@HELLOWANG-MB1 ~ % go get github.com/astaxie/beegogo: downloading github.com/astaxie/beego v1.12.3go: downloading github.com/prometheus/client_golang v1.7.0go: downloading github.com/hashico ...
双数组字典树
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
0. 前置知识需要提前有字典树的知识
1. 双数组字典树介绍双数组字典树英文名为DoubleArrayTrie,他的特点就是使用两个数组来表示一颗字典树,这里有比较有趣了,两个数组是怎么表达出字典树的呢?
2. 双数组介绍顾名思义,有两个数组,一个是base,另一个是check。
首先介绍数组的下标,数组的下标代表字典树上节点的编号,一个下标对应一个节点。
其实base数组的作用是用来记录一个基础值,这个值可以是随机值,只要不产生冲突就可以了,所以这个值可以用随机数算法获取,当然这样效率不高,高效的做法应该是使用指针枚举技术,ok,现在你已经明白了,base数组是一个不产生冲突的随机数组。
最后,check数组,check数组与base数组相互照应,如果base[i]=check[j] 则说明j是i的儿子,而且i到j的边权恰好为j-base[i],也可以写作j-check[j]好好理解这句话
...
Go入门-Go语言从入门到进阶实战
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. 开始学习Go从一本书开始,这本书叫做《Go语言从入门到进阶实战(视频教学版)》,当然这篇Blog并不是所有的内容都来自这本书,毕竟书中也有不足之处。
2. Hello World学啥语言的第一步都是Hello World, 第一步是搭建开发环境,直接下载Goland,创建一个新的工程,点击create
建好项目以后,项目应该是下面这个样子的,当然我们不用关注这个go.mod是干什么的,我们只是利用IDE编写代码,使用命令行运行。
123456s@HELLOWANG-MB1 go-study % tree.`-- go.mod0 directories, 1 file
然后新建一个main.go的文件,其内容如下
12345package mainimport "fmt"func main() { fmt.Println("h ...
Go进阶-协程的本质与CPU的争夺
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. 从协程谈起很多语言都支持协程,那什么是协程,和线程进程有什么区别呢?这里推荐一篇Blog,笔者直接提取其中最重要的部分
进程、线程 和 协程 之间概念的区别
对于 进程、线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法)
对于 协程(用户级线程),这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的,因为是由用户程序自己控制,那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程/线程,通常只能进行 协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。
goroutine 和协程区别
本质上,goroutine 就是协程。 不同的是,Golang 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理,当遇到长时间执行或者进行系统调用时 ...
磁盘设备指令
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
给磁盘分区
1fdisk /dev/vdc
格式化分区
1mkfs.ext4 /dev/vdc
挂载磁盘
1mkdir -p /data/ssd && mount /dev/vdc /data/ssd