🖼 golang-图片旋转

最近在做旋转图片验证码,需要对图片进行旋转,网上没有找到类似的库,也没有扎到对应的方法,只有一些简单旋转90度,180度,达不到我的要求。自己封装一个旋转图片的方法,可以旋转任意角度
阅读更多
GO-获取斗鱼弹幕消息

golang-标准库(sync/atomic)

这个库是用来保证并发编程数据安全的。提供了对数据进行原子性操作的方法。 初学者对数据的原子性操作不是太理解,sync包的锁就可以保证并发数据的安全,为什么atomic包也可以保证并发的数据安全,它跟加锁的区别又是什么。 简单说一下,锁是编程语言层面提供的保证数据并发安全的一种方式,而原子性的操作函数是操作系统层面提供的方式,C语言中也有_Atomic关键字,也是用来保证并发编程安全的。下面通过例子来认识一下
阅读更多

golang-标准库(crypto/ecdsa)

ecdsa包提供了非对称加密算法ECDSA,ECDSA为椭圆曲线加密算法,是基于椭圆方程公式,安全性要高于RSA。这里说下使用ecdsa的密匙生成和签名校验,不涉及原理;go中ecdsa目前只有用私钥加密,公钥做校验,没有解密环节;目前可以应用于数字签名;
阅读更多

golang-unsafe包的用处

我们都知道byte切片转字符串用 string(byte[]{'a'}) 就可以办到,但这种方式会在内存中声明一块新的内存来存储字符串,原来的切片在没用被引用的情况下可能会在下一次GC被回收。这里我们可以用unsafe包来达到不申请新内存用原来切片的底层数据来完成切片到字符串的转换。(在go中字符串的底层就是是byte切片,而切片的底层是数组)
阅读更多

golang-标准库(unsafe)

除了c家族的编程语言明确提供了直接通过指针运算操作内存的方式,其它语言大多屏蔽了这一操作,程序员直接操作内存往往不太安全,容易出现各种问题。go有着c的影子,保留了指针但又对指针的能力进行了削弱。在go中也不能直接进行指针运算来操作内存。但go对指针还是留了一扇不起眼的窗来进行指针运算,这扇窗就是unsafe包。

首先unsafe包的内容并不多,只有寥寥几个数据结构和函数。要使用unsafe包需要先了解内存对齐,对有c使用经验的朋友就比较简单了。数据在内存的存储并不是连续按着存放的,而是按照一定的对齐规则。使用对齐规则有一个最大的好处是避免cpu的二次读取,也就是说对齐后的数据cpu只需要读取一次。(此处不再细述原因,作者目前的知识层面也就到这儿,原因就是计算机的底层知识了)

unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用它,如果你使用它,看到了这个名字,也会想到尽可能的不要使用它,或者更小心的使用它。

虽然这个包不安全,但是它也有它的优势,那就是可以绕过Go的内存安全机制,直接对内存进行读写,所以有时候因为性能的需要,会冒一些风险使用该包,对内存进行操作。在go的标准库中也有使用unsafe包的操作(比如:sync,runtime包等)

阅读更多

golang-协程理解

总结一下go协程的理解,如有错误望请指正。

网上都说协程是一种轻量级线程,线程又是一种轻量级的进程。这话在语言层面看来是没有错的,但它们的实现是不同的。

线程是cpu资源调度的最小单位。协程不由cpu进行调度,由应用程序进行调度,也就是由go进行调度。在go中,协程的调度也有专门的调度器。但go的协程调度器的复杂程度比cpu的线程调度器是要低许多的。

计算机进程/线程的运行是抢占式的,操作系统负责分配cpu执行时间给各个线程,当时间到达后,当前线程必须暂停进入睡眠,等待后续获得cpu执行时间再度恢复执行;当然线程也可以主动放弃cpu,进入睡眠,这一操作大多由程序员来控制。

阅读更多