前言
从我记事起就比较容易做梦,有多容易呢,我在桌子上趴10秒有时候就能做个梦,以前也有想研究或者记录下自己梦,每次都没坚持下来。这次在博客上开这个栏目用于后面记录醒来后记得比较清楚的梦并根据情况做些简单的分析,后面也会继续去关注梦方面的书籍深入研究这方面的东西。
梦的时间地点
梦的日期:2018/08/21,大约时间13:40-13:59
地点:公司工位
梦的内容
地点:一间很熟悉、同学很多的教室。
时间:梦开始时正在上课、梦里的教室人比较多、课本也比较多,推测应该是初中或高中的时候。
人物:梦里的人物没有比较清晰的特征,感觉好像是中学时期好多同学的形象交杂着,有个男同学感觉跟我比较亲近,表
这里记录以后准备读或者重读一些书的计划,计划起于 2018/11/01,多读书提升技术和各方面认知。
正在读
技术类
<< 算法导论 >> 5%
<< 现代操作系统 >> 10%
<< 亿级流量网站架构核心技术 >> 50%
<< 这就是搜索引擎 >> 25% 介绍搜索引擎的架构和各部分实现方案。
<< 编码的奥秘 >> 25% 计算机编码普及读物
<< 数学史 >> 4% 数学历史发展和起源
<
在程序开发过程中我们经常需要去做性能测试、或性能排查方面的工作,而 Go 语言自带的 pprof 是个非常强大的工具,不仅使用简单而且可以用于线上服务性能的排查。
pprof 采样数据主要有三种获取方式:
runtime/pprof:手动调用 pprof API 来生成和写入采样文件,灵活性高。
net/http/pporf 通过 http 服务获取采样文件,简单易用,适用服务性能排查
go test 通过 go test -bench . -cpuprofile prof.cpu 获得采样文件,适用于对函数单独性能测试
我们这里演示下 net/http/pprof 的使用
基于web应用
IP 地址(Internet Protocol Address)是给每一个连接到互联网上的设备分配的一个全球唯一的标识符,也成为网际协议地址,IP 地址包括两类 IPv4 和 IPv6。
IPv4
在 TCP/IP 协议中,IP 地址是以二进制的形式表示的,共 32bit,为了方便记忆,我们一边使用十进制来记录比如:10.11.123.23。
IPv4 分类
A 类地址
A 类地址由 1 字节的网络地址和 3 字节的主机地址组成,且网络地址最高位为 “0”。
A 类地址网络数为 2^7=128,扣除两个保留地址:全是 0 的做为网络号,全是 1 的做为广播号。所以 A 类地址网络地址范围为 1
竞态检查器
go run -race main.go
编译反编译
// 编译
go build -gcflags="-S"
go tool compile -S hello.go
go tool compile -N -S hello.go // 禁止优化
// 反编译
go tool objdump <binary>
我们用 Go 写两个遍历两层 slice 的算法。
var items = make([][]int32, 1000)
func init() {
for i := 0; i < 1000; i++ {
items[i] = make([]int32, 1000)
for j := 0; j < 1000; j++ {
items[i][j] = rand.Int31n(2)
}
}
}
// 横向遍历
func sumRows() int {
var sum = 0
for
什么是基准测试
基准测试是测量一个程序在固定工作负载下的性能。我们通常会用来对比对同一个问题不同解决方案的性能,从而帮助我们做决定选择哪个方案更合理。
Go 的基准测试
Go 基准测试规则如下:
必须放在以 _test.go 结尾的文件中。
函数名必须以 Benchmark 开头
函数必须接受一个参数 *testing.B
没有返回值
基准测试受机器状态等因素的影响每次跑的结果很难保持完全一致,但是基本会在一个很小的范围内波动。
写一个简单的基准测试如下
import "testing"
func sum() int {
sum := 0
for i := 1; i &l
首先我们知道什么是流(stream),流物理设备的输入输出、存储设备上的文件的输入输出都映射到逻辑上的数据流,这是用来消除设备直接差异而抽象的一个概念。
通常情况下每个程序在启动的时候都会定义3个流:stderr、stdout、stderr,分别用来输入、输出、诊断和错误信息的输出,通常他们会被连接到用户终端(tty(4)),但是也可以修改到其他的文件和设备(重定向)。这取决于双亲进程的选择和设置。
Linux的本质是一切皆是文件,输入输出设备也是使用文件的形式存在和管理的,内核启动的时候默认会打开三个I/O设备文件:stdin、stdout、stderr,分别得到的描述符是0,1,2,并且他
我们在应用调试或者线上业务中经常会用到日志功能,而 Go 语言内置了 log 模块。
log 模块的使用
先来看下 log 模块的基本使用:
package main
import (
"log"
)
func main() {
log.Println("hello log.Println")
log.Printf("hello %s", "log.Printf")
}
我们运行一下可以看到如下输出:
> $ go run main.go
2018/10/29 10:45:39 hello log.Println
2018/10/29 10:45:39 hel
冒泡排序是最基本的排序算法,它的复杂度为O(n²)。
它的实现原理非常简单,就是从头遍历数组,如果第 i 个数比第 i + 1 个数大,那么就交换他们,这样遍历第一次就会让最大的数放到数组末尾,第二遍会把第二大的数放到数组倒数第二的位置,依次类推……
冒泡排序过程图形表示如下:
那么我们可以实现最基本的冒泡排序如下:
func BubbleSort1(list []int) {
n := len(list)
for i := 0; i < n; i++ {
for j := 0; j < n-1; j++ {
if list