/images/avator.png

xingliuhua

不见其增,日有所长。

golang 单例和once详解

饿汉式 type singleton struct { } var instance = new(singleton) func GetInstance() *singleton{ return instance } 或者 type singleton struct { } var instance *singleton func init() { instance = new(singleton) } func GetInstance() *singleton{ return instance } 这两种方法都可以,第一种我们采用创建一个全局变量的方式来实

sync包

锁 共享内存的并发问题 在很多语言中并发编程都有对一个内存进行读写的情况,比如下面的测试: func test() { count++ println(count) } var count int func main() { for i := 0; i < 30; i++ { go test() } time.Sleep(3 * time.Second)

排序算法

排序 我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。 排序算法大体可分为两种: 一种是比较排序,时间复杂度O(nlog

go channel

底层结构 type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send waiters // lock protects

go map

hash冲突 哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般有两种应对方法:链表法和开放地址法。链表法将

golang slice

slice slice是一个数组某个部分的引用,非协程安全的。 创建 通过数组创建 切片的初始化格式是:var slice1 []type = arr1[start:end],star

range语句

range slice func main() { s := []int{1, 2, 3} for i := 0; i < len(s); i++ { if i == 1 { s = append(s, 4) } fmt.Println(i, s[i]) } } 上面的代码,遍历中新增元素是没有问题的。 但是下面的range遍历,结果是不

Redis 内存过高

查找bigkey redis-cli --bigkeys 统计每种数据类型的键值对个数以及平均大小。此外,这个命令执行后,会输出每种数据类型中最大的 bigkey 的信息,对于 String 类型来说,会输

Redis学习(四)-golang使用redis

该文章讲解redigo的使用。 talk is cheap show me the code redigo基本使用 opt := redis.DialPassword("root") c, err := redis.Dial("tcp", "127.0.0.1:6379", opt) if err != nil { fmt.Println("Connect to redis error", err) return } defer c.Close() userName, err := redis.String(c.Do("GET", "userName")) if err != nil { fmt.Println("redis get failed:", err) }

golang包管理

什么是vendor go vendor 是go 1.5 官方引入管理包依赖的方式,1.6正式引入。其基本思路是,将引用的外部包的源代码放在当前工程的vendor目录下

context

为什么要有context 为了在协程之间传递信息,比如网络服务,每个请求都是一个协程,在协程中还可能开启新的子协程,子协程中还有新的协程,我们

golang字符串拼接大比拼

拼接字符串大对比 直接+拼接 func StringsAdd() string { var s string for _, v := range StrData { s += v } return s } 使用fmt包进行组装 func StringsFmt() string { var s string = fmt.Sprint(StrData) return s } 使用strings包的joi