Visualizing Concurrency in Go

If you prefer video over blog posts, here is my talk on this at GopherCon 2016: https://www.youtube.com/watch?v=KyuFeiG3Y60 One of the strongest sides of Go programming language is a built-in concurrency based on Tony Hoare’s CSP paper. Go is designe...阅读全文

divan's blog Jan 24, 2016 divan

How to complain about Go

Over the years of existence of Go programming language, the articles with its critique was always popular, bringing a lot of discussion from both sides. Recently, Maksim Kochkin even created GitHub repo with curated list of articles complaining about...阅读全文

divan's blog Dec 14, 2015 divan

Go中的同步与锁

最近学习了Go语言中同步包中的互斥锁、读写锁、Once、waitGroup。在并发程序开发的过程中,这两种锁是非常重要的,包括对共享资源进行访问控制的时候。sync是Go语言中的标准库。 Mutex 互斥锁 互斥锁是传统并发程序对共享资源进行访问控制的主要手段。是sync包中的Mutex结构体。 type Mutex struct {} 该结构体包括了两个方法,可以说是非常简单使用的 func (m *Mutex) Lock() {} func (m *Mutex) Unlock() {} 我们...阅读全文

HundredLee's Blog May 22, 2017 HundredLee

Go包管理的探索与实践

引言:刚学Go没多久,但是很快我就发现了Go的一个特别坑爹的地方 —— 包管理。当然不只是GFW的问题,更多的是有的时候,每个项目使用的包的版本并不是完全一致的,而Go无法做到这一点。虽然Go1.5之后加了vendor的特性,但是我仍然觉得不够。 不知道大家学过java、php没?例如maven、composer都是很好用的包管理工具。你可以针对每个项目建立一个包管理文件,并对每个依赖项进行版本控制。这是我需要的。并可以在项目的根目录生成lock文件,在安装依赖后,把安装时确切的版本号列表写入 ...阅读全文

HundredLee's Blog May 20, 2017 HundredLee

关于Goroutine Channel Select 的用法和理解

声明 转载请注明本文地址,感谢 :) 了解进程、线程、协程 本文不详细解释这三个名词的意思,下面有一篇文章,不懂的同学可以参考看看。 http://www.cnblogs.com/work115/p/5620272.html Goroutine的使用 Goroutine 奉行通过通信来共享内存,而不是共享内存来通信 使用goroutine很简单,只需要用到一个关键字go,我们用一段代码来示例一下如何使用go关键字 12345678910111213package mainimport ( "fm...阅读全文

HundredLee's Blog May 16, 2017 HundredLee

【Go学习笔记】13、反射 reflect

反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地反射使用TypeOf和ValueOf函数从接口中获取目标对象信息反射会将匿名字段作为独立字段(匿名字段本质)想要利用反射修改对象状态,前提是interface.data 是settable,即pointer-interface通过反射可以动态调用方法 结构体反射12345678910111213141516171819202122232425262728293031323334353637383940...阅读全文

HundredLee's Blog May 16, 2017 HundredLee

【Go学习笔记】12、接口 interface

接口interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为Structural Typing 接口只要方法声明,没有实现,没有数据字段 接口可以匿名嵌入其他接口,或嵌入到结构中 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针 只有当接口存储的类型和对象都为nil时,接口才等于nil 接口调用不会做receiver的自动转换 接口同样支持匿名字段方法...阅读全文

HundredLee's Blog May 12, 2017 HundredLee

【Go学习笔记】11、方法method

方法method Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的组合 只能为同一个包中的类型定义方法 Receiver 可以使类型的值或者指针 不存在方法重载 可以使用值或指针来调用方法,编译器会自动完成转换 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第1个参数(Method Value vs. Method Expression) 如果外部结构和潜入结构存在同名方法,则优先调用外部结构的方法 类型别名不会拥有底层...阅读全文

HundredLee's Blog May 12, 2017 HundredLee

【Go学习笔记】10、结构struct

结构struct Go中的struct与c中的struct非常相似,并且Go没有class 使用typestruct{} 定义结构,名称遵循可见性规则 支持指向自身的指针类型成员 支持匿名结构,可用作成员或定义成员变量 匿名结构也可以用于map的值 可以使用字面值对结构进行初始化 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值 支持 == 与 != 比较运算符,但不支持 > 或 < 支持匿名字段,本质上是定义了以某个类型名为名称的字段 嵌入结构作为匿名字段看起来像继承,但不是继...阅读全文

HundredLee's Blog May 12, 2017 HundredLee

【Go学习笔记】9、函数func

函数func Go函数不支持嵌套、重载和默认参数 但是支持一下特性 无需声明原型、不定长度变参、多返回值、命名返回值参数 匿名函数、闭包 定义函数使用关键字func,且左大括号不能另起一行 函数也可以作为一种类型使用 1234567891011121314151617181920212223//commomfunc main() { a,b,c,d := 1,2,3,4 test(a,b,c,d)}func test(s ...int) { fmt.Println(s)}//closurefun...阅读全文

HundredLee's Blog May 10, 2017 HundredLee

【Go学习笔记】8、map

map 类似其他语言中的哈希表或者字典,以key-value形式存储数据 key必须是支持==或!=比较运算的类型,不可以是函数、map或slice Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍 Map使用make()创建,支持:=这种简写方式 map([keyType]valueType,cap) ,cap表示容量,可省略 超出容量时会自动扩容,但尽量提供要一个合理的初始值 使用len()获取元素个数 键值对不存在时自动添加,使用delete()删除某键值对 使用for r...阅读全文

HundredLee's Blog May 10, 2017 HundredLee

【Go学习笔记】7、切片slice

切片slice 其本身并不是数组,他指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 一般使用make()创建 如果多个slice指向相同底层数组,其中一个的值改变会影响全部 make([]T,len,cap) 其中cap可以省略,则和len值相同 len表示存数的元素个数,cap表示容量 1234func main(){ s1 := make([]int, 10, 10) fmt....阅读全文

HundredLee's Blog May 9, 2017 HundredLee

【Go学习笔记】6、数组array

数组array 定义数组的格式:var [n] , n >= 0 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型 注意区分指向数组的指针和指针数组 数组在Go中为值类型 数组之间可以使用== 或者 != 进行比较,但不可以使用<或> 可以使用new来创建数组,此方法返回一个指向数组的指针 Go支持多维数组 12345678910111213141516171819202122232425//多维数组定义func main (){ numbers := [2][3] int { {1,...阅读全文

HundredLee's Blog May 9, 2017 HundredLee

【Go学习笔记】 5、控制语句

指针 Go虽然保留了指针,但与其他编程语言不同的是,在Go当中不支持指针运算以及“->”运算符,而直接采用“.”选择符来操作指针目标对象的成员 操作符 “&”取变量地址,使用“ * ” 通过指针间接访问目标对象 默认值为nil而非NULL 递增递减语句 在Go当中,++与– 是作为语句而并不是作为表达式。 选择语句switch 可以使用任何类型或表达式作为条件语句 不需要写break,一旦条件符合自动终止 如希望继续执行下一个case,需使用fallthrough语句 支持一个初始化表达式(可以...阅读全文

HundredLee's Blog May 9, 2017 HundredLee

【Go学习笔记】 4、常量与运算符

常量的定义 常量的值在编译时就已经确定 常量的定义格式与变量基本相同 等号右侧必须是常量或者常量表达式 常量表达式中的函数必须是内置函数 1234567891011121314const a int = 1const b = 'A'const ( text = "123" length = len(text) num = b * 20)const i,j,k = 1,"2","3"const ( text2,lenght2,num2 = "234",len(text2),k * 10) 常量的初...阅读全文

HundredLee's Blog May 8, 2017 HundredLee

【Go学习笔记】 3、Go 类型与变量

基本类型 布尔型:bool 长度 : 1字节 取值范围:true ,false 整型:int/uint 根据运行平台可能为32位或64位 8位整型:int8/uint8 长度:1字节 取值范围:-128~127/0~255 字节型:byte (uint8别名) 16位整型:int16/unint16 长度:2字节 32位整型:int32(rune)/uint32 长度:4字节 64位整型:int64/uint64 长度:8字节 浮点型:float32/float64 长度:4/8字节 小数位:精...阅读全文

HundredLee's Blog May 8, 2017 HundredLee

【Go学习笔记】 2、Go基础知识

Go 程序的一般结构:basic_structrue.go123456789101112131415161718192021222324// 当前程序包名package main//导入其他的包import "fmt"//常量定义const PI = 3.14//全局变量的生命和赋值var name = "gopher"//一般类型声明type newType int//结构体type gopher struct{}//接口声明type golang interface{}func main()...阅读全文

HundredLee's Blog May 8, 2017 HundredLee

【Go学习笔记】 1、Go编程基础

什么是Go? Go 是一门 并发支持、垃圾回收和编译型系统编程语言,旨在创造一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的一门编程语言。 Go的主要特点有哪些? 类型安全 和 内存安全 以非常 直观 和 极低代价 的方案实现 高并发 高效的垃圾回收机制 快速编译 为多核计算机提供性能提升的方案 UTF-8编码支持阅读全文

HundredLee's Blog May 8, 2017 HundredLee

从零开始学习 Go ——安装

0x01 设置 Go 环境 要安装并顺利使用 Go,第一步就是要设置 Go 的环境。 需要设置的 Go 的环境变量,一共有三个。 GOROOT Go 语言的源码以及安装目录。 GOPATH Go 语言的开发目录,目录可以有多个,但是,当我们执行 go get 命令的时候,如未指定目录,会默认保存在第一个目录下。 GOROOT_BOOTSTRAP 这个目录在安装 Go 1.5 版本及之后的版本时需要设置。由于在 1.4 版本后,Go 编译器实现了自举,即通过 1.4 版本来编译安装之后版本的编译器...阅读全文

Segmentfault 2017-05-30 10:05:40 daryl

kubernetes环境部署运行codis

初衷 为什么要在kubernetes上搭建codis系统,一个原因是很多服务已经运行在kubernetes上,将codis迁移到kubernetes上,可以更方便的使用;另一个重要原因是,结合kubernetes的特性,搭建一套基本不需要人为运维参与的codis系统(如果熟悉codis的话,会知道codis需要人的参与有些重,异常情况基本都需要人为参与处理),后面会详细说明如果做到基本不需要人为参与,原理、实现及一些折中选择。 目标 在kubernetes环境,一键部署一套codis系统,该co...阅读全文

简书 2017.05.29 23:46 left2right