0%

祝福你,远行的人儿!

不知道这句话说了多少遍,但我会把这句话由衷的送给每一个给予我快乐和美好回忆的人和物,包括我自己!

今天已经是2020年的1月5号,找空来公司一个人安安静静的看看2019年的照片,仔细想想这一年发送的种种;不管是流水账还是真情实意总得记上一笔,之前总是在做但却疏于记录和总结。

已经迈进了30+的年龄,老婆说总是觉得三十岁是一个很重要的点;我也觉得是这样,可却说不出来重要在哪里。

谨以此篇回顾过去,展望未来!

阅读全文 »

在go语言中,我们可以简单的把没有接受者的函数称作函数,而把有接受者的函数称作方法。函数和方法 这种说话的区分主要是借鉴或者是受面向对象(OOP)编程影响,在面向对象编程中我们把定义在类中的函数称作方法。

go语言中的类型方法调用,一般是通过类型变量.方法名(参数...)的方式来调用; 当然我们也可以面向过程的方式来使用方法,此时方法将作为一个普通的函数,类型变量作为该函数的第一个参数(是不是感觉有点Python的味道);

推荐 《go语言高级编程-1.4.2 方法》

阅读全文 »

Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现

  • 首先,Go语言的数组是一种值类型,虽然数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。
  • Go语言字符串底层数据也是对应的字节数组,但是字符串的只读属性禁止了在程序中对底层字节数组的元素的修改。字符串赋值只是复制了数据地址和对应的长度,而不会导致底层数据的复制
  • 切片的行为更为灵活,切片的结构和字符串结构类似,但是解除了只读限制。切片的底层数据虽然也是对应数据类型的数组,但是每个切片还有独立的长度和容量信息,切片赋值和函数传参数时也是将切片头信息部分按传值方式处理。因为切片头含有底层数据的指针,所以它的赋值也不会导致底层数据的复制

其实Go语言的赋值和函数传参规则很简单,除了闭包函数以引用的方式对外部变量访问之外,其它赋值和函数传参数都是以传值的方式处理。要理解数组、字符串和切片三种不同的处理方式的原因需要详细了解它们的底层数据结构。

阅读全文 »

concurrent map

正如 这里这里所描述的, Go语言原生的map类型并不支持并发读写。concurrent-map提供了一种高性能的解决方案:通过对内部map进行分片,降低锁粒度,从而达到最少的锁等待时间(锁冲突)

在Go 1.9之前,go语言标准库中并没有实现并发map。在Go 1.9中,引入了sync.Map。新的sync.Map与此concurrent-map有几个关键区别。标准库中的sync.Map是专为append-only场景设计的。因此,如果您想将Map用于一个类似内存数据库,那么使用我们的版本可能会受益。你可以在golang repo上读到更多,这里 and 这里
译注:sync.Map在读多写少性能比较好,否则并发性能很差

阅读全文 »

函数的返回值通过使用可选的返回语句(return)返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行

阅读全文 »