请问如何能反射某个包package下面所有的结构struct?
最近在看反射相关的东西,想要能够反射包里所有的结构,找了半天资料也没找到相关的文章和答案。 如果可以的话,麻烦大牛们解疑指教...阅读全文
最近在看反射相关的东西,想要能够反射包里所有的结构,找了半天资料也没找到相关的文章和答案。 如果可以的话,麻烦大牛们解疑指教...阅读全文
1. 从http://www.golangtc.com/download下载适合平台的go安装包,我这里选择的是go1.5.1.linux-amd64.tar.gz 2.把安装包拷贝到/usr/local/目录下 sudo cp go1.5.1.linux-amd64.tar.gz /usr/local 3.进入/usr/local/目录下,解压文件go1.5.1.linux-amd64.tar.gz sudo tar xf go1.5.1.linux-amd64.tar.gz4.在/etc/profile文件末尾添加:
#go configuration export GOROOT=/usr/...阅读全文
许多年前, 你有一双清澈的双眼, 奔跑起来像是一道春天的闪电。 本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/ 大家应该都有相同的遭遇,工作久了难免有倦怠,技术的热情有时会被日常的琐碎淹没。 而有机会拓展新领域、新技能则让人特别兴奋。 这次很幸运,遇到了Go语言。(估计得让朋友们鄙视了。)一直困在嵌入式届,比较孤陋寡闻,很少接触到这些平台端的开发语言。 Golang是厉害的。 云风大神这样评价Golang: 我发现我花了四年时间锤炼自己用 C 语言构建系统的能力,试图找到一个规范,可以更好的编写软件。结果发现只是对 Go 的模仿。缺乏语言层面的支持,只能是一个拙劣的模仿。 Golang是有趣的。 首页上就是吉祥物 Gopher(土拨鼠)...阅读全文
// one project main.go package main import ( "fmt" "runtime" "sync" ) var counter int = 0 func Count(lock *sync.Mutex) { //每次对counter操作前都需要加锁,每次使用完之后都要解锁。 lock.Lock() counter++ fmt.Println(counter) lock.Unlock() } func main() { //创建一个sync包下的Mutex结构体 lock := &sync.Mutex{} for i := 0; i < 10; i++ { go Count(lock) } for { lock.Lock() c := counter lock...阅读全文
这几天我们的新游戏上线了,说实话还是挺好玩的。首发的是MAC版本,这两天发布了Android版本,Android版本的盈利方式主要考虑就是广告。此处记录一下我们在集成广告时候的一些经验。 我们的游戏引擎底层是基于 Gomobile 来打包的,但是 Gomobile 并没有提供任何方式来集成第三方的jar包,虽然可以通过 Go->Cgo-Java 的方式来调用java代码,但是却无法添加新的java代码,解决方案其实非常简单,直接新建一个 Android 工程,然后把打包后的 .so 文件烤包到 jniLibs 目录,然后就可以直接运行这个 Android 工程了。 以下是具体的实现细节: 新建一个 Android 工程 复制 Gomobile 中的 GoNativeActivity.java...阅读全文
编程接口的变化 为了支持OTG特性,编程接口上作了尽可能小的改动。这些改动并不会改变已有的编程模型:主机端仍然会用 urb和usb_device,设备端仍然会用ueb_request和usb_gadget。从某些角度来说,也许我们更希望将urb变成类似urb_gadget这样的轻量级模型,这样在主机和设备端就可以有对称的编程接口。但是现在还没必要去这样做。 设备端:usb设备控制器(USB Device Controller) 在gadget接口中新添了一些OTG状态标志和usb_gadget_*()调用。用户接口通过OTG状态标志来报告OTG设备的需要,而新增的gadget调用用来支持新的USB状态的转变(一些调用也可以支持non-OTG系统)。除了is_otg标志,其他的状态标志还局限于...阅读全文
概念 原子操作,意思就是执行的过程不能背终端的操作。在针对某个值的原子操作执行过程中,cpu不会再去执行其他针对这个值得操作。在底层,这会由CPU提供芯片级别的支持,所以绝对有效。即使在拥有多CPU核心,或者多CPU的计算机系统中,原子操作的保证也是不可撼动的。Go语言提供了院子操作的包atomic。其中有很多函数可以帮助我们进行原子操作。但是只能对几种简单类型进行原子操作:int32、int64、uint32、uint64、uintptr和unsafe.Ponter。atomic为这些简单类型童工了5中操作函数:增或减、比较并交换、载入、存储和交换。 为什么选择原子操作 我们知道go语言在sync包中提供了锁的包,但是为什么我们还要使用atomic原子操作呢?总结下来有一下几个原因: 加锁...阅读全文
Map is like a Go map[interface{}]interface{} but is safe for concurrent useby multiple goroutines without additional locking or coordination. Loads, stores, and deletes run in amortized constant time. 上面一段是官方对sync.Map 的描述,从描述中看,sync.Map 跟map 很像,sync.Map 的底层实现也是依靠了map,但是sync.Map 相对于 map 来说,是并发安全的。 1. 结构概览 1.1. sync.Map sync.Map的结构体了 type Map struct ...阅读全文
```go package main import ( "fmt" ) func main() { for { go NewJob() } } func NewJob() { var buf [1024]byte fmt.Println(buf) } ``` 内存持续上涨,到一定程度直接因为内存读取过多闪退崩溃。如果真的遇到这种情况的程序,需要goroutine里开很多buf,该这么解决? 请问何...阅读全文
1、下载配置Golang,配置相关环境 一、现在地址:http://www.golangtc.com/download 我选择的是下面这个(64位,linux版) 二、配置环境 解压后在.bashrc中配置环境变量 2、配置gocode 默认情况下go的解压包里面没有gocode,所以我们需要安装一个,通过命令: ? 1 go get -u github.com/nsf/gocode 就可以在go的目录里看到了: 3、eclipse集成goclipse插件 goclipse(https://github.com/GoClipse/goclipse )是eclipse的一个go语言插件,可以在eclipse里面在线安装也可以下载,解压,将features和plugins目录里面的文件复制到ec...阅读全文
下载 4.0.1 版本的 ZeroMQ 代码后解压到任意目录。 tar -xzvf zeromq-4.0.1.tar.gz cd zeromq-4.0.1 ./configure --prefix=/usr make make install go get -tags zmq_4_x github.com/alecthomas/gozmq 测试程序 package main import ( "fmt" zmq "github.com/alecthomas/gozmq" "os" ) func main() { major, minor, patch := zmq.Version() fmt.Printf("Current 0MQ version is %d.%d.%d\n", major,...阅读全文
Go语言sync package提供了条件变量(condition variable)类型: type Cond struct { // L is held while observing or changing the condition L Locker // contains filtered or unexported fields } type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait() type Locker type Locker interface { Lock() Unlock() } A Locker r...阅读全文
写解锁会试图唤醒所有因欲进行的读锁定而堵塞的 goroutine 读解锁只会试图唤醒一个因欲进行写锁定而被堵塞的 goroutine package main import ( "fmt" "sync" "time" ) // 读写锁 /** sync.RWMutex 读写锁类型 提供的函数: 写锁:加锁/解锁 func (*RWMutex) Lock() func (RWmutex) UnLock() 读锁:加锁/解锁 func (*RWMutex) RLock() func (RWmutex) RUnLock() 写解锁会试图唤醒所有因欲进行的读锁定而堵塞的 goroutine 读解锁只会试图唤醒一个因欲进行写锁定而被堵塞的 goroutine **/ func main() { var...阅读全文
package main import ( "archive/zip" "fmt" "github.com/axgle/mahonia" "io" "os" ) func main() { File, err := zip.OpenReader("init.zip") if err != nil { fmt.Println(err) } defer File.Close() for _, v := range File.File { info := v.FileInfo() if info.IsDir() { err := os.MkdirAll(mahonia.NewDecoder("gb18030").ConvertString(v.Name), 0644) if err != nil ...阅读全文
本文是学习 A Tour of Go (中文参考 Go 之旅中文 ) 整理的笔记。介绍Go 语言线程,信道以及互斥锁的概念和使用方法。 1. Go 线程 $GOPATH/src/go_note/gotour/concurrency/goroutine/goroutine.go 源码如下 /** * go 语言线程 */ package main import ( "fmt" ) func say(s string) { for i := 0; i < 2; i++ { fmt.Println(i, s) } } func main() { go say("world") say("hello") } 1234567891011121314151617181920 /** * go 语言...阅读全文
import ( "os" "archive/zip" "io" "fmt" "strings" ) // ZipFiles compresses one or many files into a single zip archive file. //压缩多个文件到一个文件里面 // Param 1: 输出的zip文件的名字 // Param 2: 需要添加到zip文件里面的文件 //Param 3: 由于file是绝对路径,打包后可能不是想要的目录,oldform就是filename中需要被替换的掉的路径 //Param 4: 要替换成的路径 func ZipFiles(filename string, files []string, oldform, newform string) er...阅读全文
先到GO的官方下载地址下载自己相对应的安装包 GO下载地址:url 新一下载了(go1.2.1.linux-386.tar.gz)安装包,下载完成后解压到/usr/local/目录中 tar xzvf go1.2.1.linux-386.tar.gz -C /usr/local/ 接着给GO设置环境变量 export PATH=$PATH:/usr/local/go/bin 这样子新一就安装好了,检查下是否安装好 go version //go version go1.2.1 linux/386 OK!大功告成!GO是需要GCC的。请检查下...阅读全文
一、介绍 sync.RWMutex 为读写锁,lock为写锁定 ,Unlock 为写解锁,RLock为读锁,RUnlock为读解锁。 二、场景 适用于场景:多读一写,读可以同时进行,但是写只能一个写,读写是互斥的要么只能读或者只能写 三、代码测试 功能性测试 第一种场景 测试内容 : 读锁存在的情况下,同时出现读和写的操作,此时优先获取写锁 package main import ( "testing" "fmt" "sync" "time" ) var rwlock = &sync.RWMutex{} var wg = &sync.WaitGroup{} func TestRWMutex(t *testing.T) { //读 wg.Add(1) go rlockwork() time.S...阅读全文
发行资产 在比原链上发行资产比较方便快捷,使用节点的dashboard图形界面操作就可以,先在 “资产”一栏新建资产 新建完资产,需要上链,否则区块不认识你这个资产,那么在交易中的高级交易进行issue,点击Add action,总共三个action分别是 Issue、Control with address、Spend from account 输入账户的密码,等待交易确认,一旦确认成功资产就会发到刚才指定的地址上。可以只发一个地址,也可以发到多个地址,添加多个Control with address 即可。 编译合约 编译合约通过api进行编译,准备好postman或者其他可以post的工具,笔者使用的是postman。笔者看了官方的多个合约模版,于是准备部署一个简单的比较数字大小的合约...阅读全文
// code_026_go_antic_package project main.go
package main import ( "container/list" "fmt" "math/rand" //备注2:随机数的包 "sync" //备注1:异步任务的包 "time" ) type INFO struct { lock sync.Mutex //备注1:异步锁 Name string Time int64 } var List *list.List = list.New() //备注3:初始化List变量 func main() { var Info INFO go func() { for i := 0; i < 5...阅读全文
package main import ( "archive/zip" "fmt" "github.com/axgle/mahonia" "io" "os" ) func main() { File, err := zip.OpenReader("init.zip") if err != nil { fmt.Println(err) } defer File.Close() for _, v := range File.File { info := v.FileInfo() if info.IsDir() { err := os.MkdirAll(mahonia.NewDecoder("gb18030").ConvertString(v.Name), 0644) if err != nil ...阅读全文
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行代码,也可以 clone GitHub 上的教程仓库,进入 src 目录执行 make 即可。 引言 交易(transaction)是比特币的核心所在,而区块链的唯一目的,也正是为了能够安全可靠地存储交易。在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它。在今天的文章中,我们将会开始实现交易这个部分。不过,由于交易是很大的话题,我会把它分为两部分来讲:在今天这个部分,我们会实现交易的通用机制。在第二部分,我们会继续讨论它的一些细节。 此外,由于代码实现变化很大,就不在文章中罗列所有代码了,这里 可以看到所有的改动。 没有...阅读全文
Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 在 「19. 学习 Go 协程:详解信道/通道」这一节里我详细地介绍信道的一些用法,要知道的是在 Go 语言中,信道的地位非常高,它是 first class 级别的,面对并发问题,我们始终应该优先考虑使用信道,如果通过信道解决不了的,不得不使用共享内存来实现并发编程的,那 Gol...阅读全文
引用 sync.mutex 源代码分析 Golang 中 Mutex 的源码实现 建议阅读 Golang中Mutex的实现 图解Go里面的互斥锁mutex了解编程语言核心实现源码 互斥锁有两种状态:正常状态和饥饿状态。 在正常状态下,所有等待锁的goroutine按照FIFO顺序等待。唤醒的goroutine不会直接拥有锁,而是会和新请求锁的goroutine竞争锁的拥有。新请求锁的goroutine具有优势:它正在CPU上执行,而且可能有好几个,所以刚刚唤醒的goroutine有很大可能在锁竞争中失败。在这种情况下,这个被唤醒的goroutine会加入到等待队列的前面。 如果一个等待的goroutine超过1ms没有获取锁,那么它将会把锁转变为饥饿模式。 在饥饿模式下,锁的所有权将从unl...阅读全文
Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 在 「19. 学习 Go 协程:详解信道/通道」这一节里我详细地介绍信道的一些用法,要知道的是在 Go 语言中,信道的地位非常高,它是 first class 级别的,面对并发问题,我们始终应该优先考虑使用信道,如果通过信道解决不了的,不得不使用共享内存来实现并发编程的,那 Golang 中的...阅读全文
关于延时调用函数(Deferred Function Calls) 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用前有关键字 defer 时, 那么这个函数的执行会推迟到包含这个 defer 语句的函数即将返回前才执行. 例如: func main() { defer fmt.Println("Fourth") fmt.Println("First") fmt.Println("Third") } 最后打印顺序如下: First Second Third 需要注意的是, defer 调用的函数参数的值 defer 被定义时就确定了.例如: i := 1 defer fmt.Println("Deferred print:", i) i++ f...阅读全文
读写锁顾名思义就是只允许单进程同时写,在数据没有被写的情况下允许多进程同时读,的锁。 rust 里和 Mutex 类似,使用RAII(Resource Acquisition Is Initialization)来保证在值被Drop的时候自动解锁。而 go 里依然是需要手动解锁。 举个改写自Go标准库测试的栗子 import ( . "sync" "sync/atomic" ) const NumIterations = 1000 const NumReaders = 1000 func writer(rwm *RWMutex, activity *int32, cdone chan bool) { for i := 0; i < NumIterations; i++ { rwm.Lock(...阅读全文
读写锁(RWMutex)是在互斥锁(Mutex)的基础上构建的。Mutex笔记见另一篇 那么为什么需要读写锁呢?试想一下,在读多写少的场景下,mutex只允许一个goroutine进行读操作,而读操作往往是不会修改目标数据的。那我们为什么不允许多个goroutine并发执行读操作以提高效率呢,所以就有了读写锁。读锁和写锁互斥,但读锁和读锁不互斥。 下面是读锁和写锁的兼容性,是不是很像innoDB的排他锁和共享锁呢 . rlock lock rlock v x lock x x 数据结构 type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // 唤醒写锁的信号 readerSem...阅读全文
Go语言包中的sync包提供了两种锁,互斥锁(sync.Mutex)和读写锁(sync.RWMutex) 这一篇博文我们只说一下互斥锁。 Mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。 • 它只有两个公开方法:Lock()加锁,unlock()解锁。 • 在同一个协程中加锁后,不能再继续对其加锁,否则会panic。只有在解锁之后才能再次加锁。 • 只允许只有一个读或者写的场景 • 在使用Unlock()解锁前,未使用Lock()加锁,就会引起一个运行错误。 函数原型 func (m *Mutex) Lock() Lock方法锁住m,如果m已经加锁,则阻塞直到m解锁。 func (m *Mutex) Unlock(...阅读全文
package main import "fmt" func func1(a, b int) (result int) { /* 输入两个参数,返回两个参数相加的结果 */ result = a + b return } // 不定参数列表 func func2(args ...int){ //js 解构 for _, data := range args{ fmt.Println(data) } } func main() { //result := func1(333, 333) //fmt.Printf("result = %d\n", result) //func2(1,2,3,4,5,6,) func2() ...阅读全文
package accounts import ( "math/big" ethereum "github.com/ethereum/go-ethereum-test" "github.com/ethereum/go-ethereum-test/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum-test/event" ) // 一个账号是20个字节的数据。 URL是可选的字段。 type Account struct { Address common.Address `json:"address"` // Ethereum帐户地址 AddressLength = 20 U...阅读全文
1. log(github.com/sirupsen/logrus) log.Fatal 会直接中断当前服务, 即使是用 go func(){log.Fatal("end")}() 也会中断整个服务 2. goroutine 并发线程有3种模型(用户空间 - 系统空间): 内核级线程模型 1(系统线程-轻量级线程):1(用户线程) context switch 性能低 用户级线程模型 1(系统线程-轻量级线程):N(用户线程) context switch 成本低(实际由于无法有效利用多处理器, 效率低) 混合型线程模型 N(系统线程-轻量级线程):M(用户线程) golang的goroutine(coroutine)语义实现了此模型 3. channel FIFO(管道先进先出) for ...阅读全文
sema.go semacquire1和 semrelease1 函数是 sync.mutex 用来阻塞 g 和释放 g 的实现,这两个方法也实现了类似信号量的功能,并且是针对 goroutine 的信号量,由于还没看 go 调度相关的代码,sema 里跟调度相关的逻辑也不做仔细说明和代码注解 semacquire1 函数 大致流程:获取 sudog 和 semaRoot ,其中 sudog 是 g 放在等待队列里的包装对象,sudog 里会有 g 的信息和一些其他的参数, semaRoot 则是队列结构体,内部是堆树,把和当前 g 关联的 sudog 放到 semaRoot 里,然后把 g 的状态改为等待,调用调度器执行别的 g,此时当前 g 就停止执行了。一直到被调度器重新调度执行,会首...阅读全文
本文基于 go1.11 版本。 Mutex 使用 在深入源码之前,要先搞清楚一点,对 Golang 中互斥锁 sync.Mutex 的操作是程序员的主动行为,可以看作是是一种协议,而不是强制在操作前必须先获取锁。 这样说可能有点抽象,看下面这段代码: package main import ( "fmt" "sync" "time" ) type People struct { mux sync.Mutex Name string Age uint8 } func (p *People) IncAge() { p.mux.Lock() time.Sleep(3 * time.Second) p.Age++ p.mux.Unlock() } func main() { leo := &Peop...阅读全文
[Pipe](https://github.com/b3log/pipe) 是一款小而美的开源博客平台,使用 golang、Vue.js 编写。 v1.8.3 主要是支持了前台主题的 PJAX。 ### 安装 [下载](https://pan.baidu.com/s/1jHPtHLO)最新的 Pipe 包解压,进入解压目录直接运行 pipe/pipe.exe 可执行文件即可。 从 1.8.2 升级只需将已有的配置拷贝覆盖即可,启动后会自动升级。 ### 文档 * [Pipe 用户指南](https://hacpai.com/article/1513761942333) * [Pipe 开发指南](https://hacpai.com/article/1533965022328) * [Pip...阅读全文
我写了一个 go interface 相关的代码转换为 C 代码的样例。也许有助于大家理解 go 的 interface。不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节。 Go 代码: package main import "fmt" // ------------------------------------------------------------- type IReadWriter interface { Read(buf *byte, cb int) int Write(buf *byte, cb int) int } // ------------------------------------------------------------...阅读全文
关于延时调用函数(Deferred Function Calls) 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用前有关键字 defer 时, 那么这个函数的执行会推迟到包含这个 defer 语句的函数即将返回前才执行. 例如: func main() { defer fmt.Println("Fourth") fmt.Println("First") fmt.Println("Third") } 最后打印顺序如下: First Second Third 需要注意的是, defer 调用的函数参数的值 defer 被定义时就确定了. 例如: i := 1 defer fmt.Println("Deferred print:", i) i++ ...阅读全文
环境搭建 下载大于1.11版本的golang 配置GOPATH 将代码拷贝到$GOPATH/src/github.com目录下 进入到代码目录运行: $go build 在代码根目录会生产一个bottos的可执行文件 进入到bcli目录 $cd bcli 编译bcli $go build 这样会在bcli目录下生产一个bcli的可执行文件 节点启动 通过对代码的编译,会得到bottos和bcli这2个可执行文件,bottos是用于启动节点的,bcli通过restful API和节点进行通信的命令行工具,它的功能包括,查看区块数据,创建帐户,发交易等 配置文件:config.toml 和 genesis.toml config.toml: # Configuration for Bottos ...阅读全文
Hello,各位小伙伴大家好,我是小栈君,近期气温有所下降,希望各位小伙伴记得防寒保暖,不要感冒了哦。 本期分享主题是关于go语言中的锁的应用场景,以及为各位小伙伴介绍实战应用中最为广泛的读写锁和互斥锁。 互联网生态的日益繁荣,人们的生活便利得到了极大的提高,通过网上操作我们基本上可以实现很多需求。 网站疯狂访问的背后应对的是一波接一波的挑战。所以在应对系统的稳定和并发的时候,程序中的“锁”就孕育而生。 互斥锁 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 也就是将共享资源变成独占资源。互斥锁的应用场景通常是写大于读操作的,它不同于读写锁的读者随意访问,而写者只有一个。 它...阅读全文
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。 还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。 以上说法都正确。 I/O多路复用 我们来回顾一下是什么是I/O多路复用。 普通多线程(或进程)I/O image 每来一个进程,都会建立连接,然后阻塞,直到接收到数据返回响应。 普通这种方式的缺点其实很明显:系统需要创建和维护额外的线程或进程。因为大多数时候,大部分阻塞的线程或进程是处于等待状态,只有少部分会接收并处理响应,而其...阅读全文
23.蛤蟆笔记go语言——PostgrelSQL驱动使用 创建数据库用户表 #create database test; # create user astaxie with password 'astaxie'; CREATE TABLE userinfo ( uid serialNOT NULL, usernamecharacter varying(100) NOT NULL, departnamecharacter varying(500) NOT NULL, Createddate, CONSTRAINTuserinfo_pkey PRIMARY KEY (uid) ) WITH (OIDS=FALSE); CREATE TABLE userdeatail ( uidinteger,...阅读全文
关于sync.RWMutex 关于优先级 为了模拟pthread中的barrier,在代码中使用了RWMutex配合阻塞管道.而其中一个关键问题就是读锁与写锁的优先级问题. 文档里面有这样一句话:a blocked Lock call excludes new readers from acquiring the lock. 所以我们可以看到,一个阻塞的写锁会阻止新的读者请求读锁. 总结一下,我们可以将程序分阶段来阐述这个行为. N个读者添加N个读锁 一个写者试图添加写锁被阻塞 后续读者无法成功获取读锁. N个读锁全部解锁 写锁被唤醒,完成写操作,解除写锁 后续读者被唤醒,获得读锁,完成读操作 测试代码 : package main import "fmt" import "time" im...阅读全文
1、删除原有go语言 sudo rm -rf /usr/local/go 2、下载最新linux版go语言 https://golang.org/dl/ 3、拷贝到本地执行解压 cp /mnt/d/go*linux-amd64.tar.gz ~/ sudo tar -C /usr/local -xvf go*linux-amd64.tar.gz 4、如果以安装过go语言,执行以下命令显示安装情况: go version 5、如果首次安装go语言,在~/.bash_profile中加入以下变量: export PATH="$PATH:/usr/local/go/bin:$GOPATH/bin" 并执行以下命令: ~/.bash_profil...阅读全文
我们在命令行输入 eth.accounts 可以看到当前该区块链中共有几个账号,以及每个账号的公钥地址。在eth系统中,状态是由被称为“账户”(每个账户由一个20字节的地址)的对象和在两个账户之间转移价值和信息的状态转换构成的。eth的账户包含四个部分:随机数,用于确定每笔交易只能被处理一次的计数器账户目前的以太币余额账户的合约代码,如果有的话账户的存储(默认为空)简单地说,每一个eth账户都有一对公钥和私钥组成。公钥我们可以理解为就是账户地址,任何其他账户都可以访问该地址私钥可以理解为一段加密过的密码,这一对公钥和私钥共同组成一个唯一标示的eth账户。例如在上节我们建立的第一个eth账户 eth.accounts[0] 中,地址 0xbcf5b841303bc08026ce2d3b8f83...阅读全文
golang中,存在 "compress/zlib" 这个包,里面包含各压缩解压的各项设置,比如压缩级别/压缩速度。 比如 zlib包里面的常量如下: const ( NoCompression = flate.NoCompression //没有压缩 BestSpeed = flate.BestSpeed //压缩速度 BestCompression = flate.BestCompression //压缩率 DefaultCompression = flate.DefaultCompression//默认压缩 ) 压缩速度和压缩率这两个是一个相互矛盾的过程,这里面的取舍还是需要各位去仔细甄别使用场景。 func main() { b := []byte(`china GO GO !!!的...阅读全文
偶然看见这么篇文章:一道并发和锁的golang面试题。虽然年代久远,但也稍有兴趣。 正好最近也看到了 sync.Map,所以想试试能不能用 sync.Map 去实现上述的功能。 我还在 gayhub上找到了其他人用 sync.Mutex 的实现方式,【点击这里】。 归结一下 需求是这样的: 在一个高并发的web服务器中,要限制IP的频繁访问。现模拟100个IP同时并发访问服务器,每个IP要重复访问1000次。每个IP三分钟之内只能访问一次。修改以下代码完成该过程,要求能成功输出 success: 100。 并且给出了原始代码: package main import ( "fmt" "time" ) type Ban struct { visitIPs map[string]time.Tim...阅读全文
前言 channel是golang中标志性的概念之一,很好很强大! channel(通道),顾名思义,是一种通道,一种用于并发环境中数据传递的通道。通常结合golang中另一重要概念goroutine(go协程)使用,使得在golang中的并发编程变得清晰简洁同时又高效强大。 今天尝试着读读golang对channel的实现源码,拿起我生锈的水果刀,装模作样的解剖解剖这只大白老鼠。 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 o...阅读全文
点击上方蓝色字体关注我们golang 中的延迟调用函数延迟调用函数(Deferred Function Calls)的调用方式如下:defer func_name(param-list)1 执行的时机func f1() (ret int) {defer func() {ret++}()return 0} func f2() (ret int) {tmp := 1defer func() {tmp = tmp + 10}()return tmp} func f3() (ret int) {defer func(ret int) {ret = ret + 10}(ret)return 1} 先不要运行程序,心里记下自己认为分别运行这三个函数的结果,然后我们慢慢分析。这里先说结论:网上有篇博文讲的...阅读全文
image 针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样。 源代码位置:sync\mutex.go。 可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the mutex and competes with new arriving goroutines over the ownership. New arriving goroutines h...阅读全文
Go 其他特性 为了保持 Go 语法介绍的完整性,有一些 Go 独有的特性,并没有在前面的章节介绍。说 Go 独有的特性其实并不恰当,因为其他语言并非在语言层面定义上下面的几个特性。 本节想介绍的关键字与函数包括 defer, append, close, make, new, copy, delete,只有第一个是关键字,后6个都是内置函数。 defer defer 是 Golang 中的广义的通用析构函数。析构函数是在Java,C++类中所定义的一类在类被销毁时执行收尾的函数。什么叫收尾,就是类似于离家出门前总是要锁门;下班了总是要打卡这样一类,默认都需要在结束时做的事情。在函数结束时,哪些工作需要收尾呢? 打开的文件要关闭,不管发生读写任何操作; 打开的网络连接要关闭,不管你访问了哪些...阅读全文