Golang的内存对齐

什么是内存对齐

CPU在访问内存的时候,并不是一个字节一个字节读取,而是以字长(word size)为单位访问。32位CPU字长为4字节,64位CPU字长是8字节。32CPU访问内存的时候只能以4的倍数的内存开始地址读取。如果一个变量存储在跨字长的内存区域上,CPU就需要多次访问内存才能读取。

Golang为了尽量避免这种跨字长的内存访问,在内存分配时会做一次内存对齐。

内存对齐示例

1
2
3
4
5
6
7
8
9
10
11
12
13
type Foo struct {
a bool
b uint32
c uint32
}

func main() {
f := Foo{}
fmt.Printf("Foo.a size: %d\n", unsafe.Sizeof(f.a))
fmt.Printf("Foo.b size: %d\n", unsafe.Sizeof(f.b))
fmt.Printf("Foo.c size: %d\n", unsafe.Sizeof(f.c))
fmt.Printf("Foo size: %d\n", unsafe.Sizeof(f))
}

Read More

WaitGroup实现原理

基本用法

sync.WaitGroup 是一个结构体类型,该类型对外只提供了三个方法, , Add(delta int)用来增加任务数量,Done()用来完成单个任务,Wait()用来等待所有任务完成,一共Add多少,Wait就需要等待多少次Done,在Done全部完成之前Wait()会阻塞当前线程。

Read More

Golang反射

概述

反射是指程序在运行时检查、修改自身结构和行为的能力,极大的能加了程序的灵活性,有的时候反射能大量的减少冗余代码。反射是把双刃剑,提供强大的扩展能力是以牺牲性能为代价的,同时反射会使程序的逻辑更为复杂,降低了代码的可读性,所以在使用反射的时候一定要慎重。

大多数高级编程语言都提供了反射的功能,Golang通过reflect包提供了简洁、高效的反射功能

reflect包

Golang反射功能比较简单,不支持从一个字符串来创建对象,所有的反射功能都是针对已有的对象,Golang反射功能把已有对象当做一个空interface,所有的反射操作都在空interface上。

Golang的反射功能都封装在了reflect包中,该包提供了两个基本类型reflect.Type, reflect.Value,Golang的反射都是围绕这两个类型进行的。reflect.Type是一个interface,可以获取跟类型相关的信息。reflect.Value是一个结构体,包含了数据相关的信息,可以对reflect.Value进行修改,实现修改运行时数据的功能。

另外该包还提供了两个基本的方法reflect.TypeOf(), reflect.ValueOf()来获取以上两个基本类型

1
2
3
4
a := 1
v := reflect.ValueOf(&a) // 直接获取变量的`value`
t := reflect.TypeOf(&a) // 直接获取变量的`type`
t = v.Type() // 通过`value`获取`type`

Read More

Golang的数组与切片

大部分编程语言都提供了数组类型的数据结构,数组是非常重要的数据结构。Golang除了提供数组,同时提供了一个跟数组类似的数据结构 - 切片(Slice),相对于Golang中的数组,切片功能更加强大,拥有更好的扩展性能

数组

数组是固定长度的一片连续的内存区域,数组的长度不能修改,需要在初始化的时候指定长度

声明与创建

数组有三种声明方式

1
2
3
var arr [5]int
var arr = [5]int{1,2,3,4,5}
arr := [...]int{1,2,3,4}

第三种声明方式本质上是一个语法糖,在编译阶段会自动推断数组的长度

Read More

mysql InnoDB 锁机制

锁类型

InnoDB使用的是行级锁,它的行锁有以下两种

  • 共享锁(S锁)
  • 排它锁(X锁)

共享锁

共享锁又被称为读锁,对于加上共享锁的记录,只允许其它事务读取记录或者给改记录增加共享锁,不允许其它事务给改记录增加排它锁,由于InnoDB所有的修改删除操作都会自动增加排它锁,所以,当一个事务给记录加上共享锁以后其它事务就无法对记录做修改操作了。需要注意的是,如果一个事务T给一条记录增加了共享锁,如果没有其它事务同时给这条记录增加共享锁,事务T自己是可以对记录加排他锁来进行更新的

Read More

Rails Asset Pipeline

介绍

什么是Asset Pipeline

Asset Pipeline是Rails用来合并,压缩,混淆css和js资源文件的框架

主要功能

合并资源文件

Asset Pipeline可以将多个资源文件(css, js)合并成一个文件。浏览器有请求并发数量限制,同时每个http请求建立断开链接也有一定开销,当单个页面引用的资源文件比较多时,这些限制和开销会造成页面加载时间变长。Asset Pipeline通过资源文件自动合并来减少浏览器http请求,间接减少页面加载时间。

Read More