Go-defer

 

Golang的defer是什么?通俗的来说就是延迟调用。 defer会在当前函数返回之前执行defer注册的函数。比如defer func_x()这样的语句会让你注册一个函数变量到defer的全局链表重,在defer语句所在的函数退出之前调用。 Golang defer的主要作用: panic 场景依然会被调用:这是一个重要的特性,通常能简化我们的代码,确保无论任何场景,defer的函数一定调用,通常在锁或者资源释放的场景较多; 配套的两个行为代码可以放在最近的位置: 创建&释放、加锁&放锁、前置&后置,使得代码更易读,编程体验更优秀。最近的地方是哪里?下一行; defer的特性 我们先深入的解析下defer具有的特性,知其然也。这些特性是需要我们记住的特点,才能更好的理解defer使用的场景 延迟调用 package main func main(){ defer println("--- defer ---") println("--- end ---") } defer会在main函数return之前调用。核心点: 延迟调用:defer语句本身虽然....

More...

Learn Go in ~5mins

 

Basics Your first Go program as a classical "Hello World" is pretty simple: First we create a workspace for our project: $ mkdir hello $ cd hello Next we create and initialize a Go module: $ go mod init hello Then we write some code using our favorite editor in a file called main.go in the directory hello you created above: package main import "fmt" func main() { fmt.Println("Hello World!") } And finally we build and produce a binary: $ go build You should now have a hello binary in your wor....

More...

Golang cgo 使用总结

 

CGO 提供了 golang 和 C 语言相互调用的机制。某些第三方库可能只有 C/C++ 的实现,完全用纯 golang 的实现可能工程浩大,这时候 CGO 就派上用场了。可以通 CGO 在 golang 在调用 C 的接口,C++ 的接口可以用 C 包装一下提供给 golang 调用。被调用的 C 代码可以直接以源代码形式提供或者打包静态库或动态库在编译时链接。推荐使用静态库的方式,这样方便代码隔离,编译的二进制也没有动态库依赖方便发布也符合 golang 的哲学。 CGO 的具体使用教程本文就不涉及了,这里主要介绍下一些细节避免使用 CGO 的时候踩坑 参数传递 基本数值类型 golang 的基本数值类型内存模型和 C 语言一样,就是连续的几个字节(1 / 2 / 4 / 8 字节)。因此传递数值类型时可以直接将 golang 的基本数值类型转换成对应的 CGO 类型然后传递给 C 函数调用,反之亦然: package main /* #include <stdint.h> static int32_t add(int32_t a, int32_t b) { retu....

More...

宵禁

 

那天,我花光了年终奖,那天是一年的最后几天,从去年开始,我渐渐意识到没有什么日子是特殊且独一无二的。就像人会变老,墙会慢慢开裂,花落的时间与花开也大致对等,也许楼下的花园里偶尔会出现几只你不曾见过的流浪猫狗,但这些对改变世界没什么太大的影响,更大的叙事里,阴谋诡计会在权柄间流转,沦为我与酒友涮锅时的谈资。 父亲近日亏了些钱,“但希望总有,年底还有新项目上马。”父亲说,然后他继续打麻将,抽香烟。 于是我转头给喜欢的女主播发微信,她回复的也快,“哥哥给些红包吧,嘻嘻。” 凭什么?凭她好看?自古千金难买一乐,人和人之间最珍贵的是快乐,记忆里快乐的滋味也存留最久,于是我转了她最后的500块钱。 “但是你写的东西我从来看不懂,嘻嘻。” 说这话时我在翻她的朋友圈,她在成都或者重庆,总之是漫展什么的。照片上透出的气息快快乐乐,健健康康。而构图看上去有些歪斜,我喜欢她的原因在于她不给自己贴标签上滤镜,看上去活泼康健的人总能让你感受到温暖。有暖气吹拂我翻动手机的指尖,父亲在门外胡了个牌,是二条。 “哈哈哈,你没有必要看明白呀,希望你快乐便好啦。”我回复她。 这瞬间真实的漂亮,要是我写剧本或者写小说时能这....

More...

杀鱼

 

小林总在做比较,在他写不出文字的时候。他会下意识的看一些烂文章,或者吃一些难吃的外卖。“这样的人都好意思往外做东西呢。”那时候他就马上扔掉手上的炒饭,在心里对自己说这之类的话,这些话能让他对自己的底气多了一分。 但现实工作并不会跟他开这种玩笑,互联网使得大家都能轻而易举地获得喜欢自己的人。像显微镜下的切片A重叠切片B,需要分开讨论的细菌变成了重影,让科学研究也变成了玩万花筒。小林身边的同事会把这种拎不清的行为称为“有腔调”。 “写东西,内容并不是第一,你要把劲儿做足,气势上就谁也唬不住你,然后也别把读者太当回事儿,我们写什么,他们就看什么,什么好用用什么就完事儿了!”抽烟的时候,决定年后家里蹲的赵行行这样说。他把烟灰弹到了小林的拖鞋上。小林下意识地把脚往后缩了缩,毕竟鞋是新的。 “哦。” 小林这样说话断然是不行的,绞尽脑汁憋出的语气助词在同事们看来是句不加掩饰的敷衍。小林为此吃了许多憋,他自己也没觉得冤枉,打心底里他是个想当大师的人,大师需要的深思熟虑小林贯彻在了每次谈话之中,而“哦。”往往都是他深思熟虑的结果。这让他没法被邀请进任何一个绞尽脑汁的小圈子里嚼另一群人的舌根,虽然在小林看....

More...

array-slice-list区别和场景

 

array 和 slice 看似相似,却有着极大的不同,但他们之间还有着千次万缕的联系 slice 是引用类型,是 array 的引用,相当于动态数组, 这些都是 slice 的特性,但是 slice 底层如何表现,内存中是如何分配的,特别是在程序中大量使用 slice 的情况下,怎样可以高效使用 slice? 今天借助 Go 的 unsafe 包来探索 array 和 slice 的各种奥妙 1. Array数组概念 数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构); 这种类型可以是任意的原始类型例如整型,字符串或者自定义类型. 数组长度必须是一个常量表达式,并且必须是一个非负整数. 数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的.数组的编译时值初始化是按照数组顺序完成的. Array数组要点: 一组已编号且长度固定的数据项序列 类型可以是任意的原始类型例如整型,字符串或者自定义类型 数组长度必须是一个常量表达式,并且必须是一个非负整数 数组长度也是数组类型的一部分 使用 make 来创建 之前的疑问,为什么数....

More...

道德至低点

 

这几年,互联网上那些“完美女性”已经完全办没法再打动我了,无论是从情感上还是理智上。一部分原因是因为科技给整个世界加了滤镜,一部分原因是我不再执着于自我投射的单一形象和狭隘的生活。 我也不怎么买那些被打造出来的“独立女性”的帐。很酷的生活方式,看不出整容痕迹的脸,创始人或高管的职业,完美的伴侣关系。我不相信任何故事的开头需要如此高的起点,正如我不相信高智商、地下室创业、单打独斗的成功学爆款文章。所以我对互联网上的一切抱有警惕心。凡是那些语焉不详,包装过度的照片和文字,我一看到就自动把真实度打折一半。 我更相信生活里的窘迫,对未来的迷茫和不知所措,那些对人的攀爬和踩踏,对自我的恐惧和虚假的伪装,以及某些时刻的真心和善意。每个人的生活都千疮百孔,有微小的希望和无数的失望组成,我们只是尽力而为,努力向前。 爱情是不是生活里的那盏微弱的灯我不知道,但是我不相信好莱坞式的爱情结局——我不喜欢所有困惑孤独的女孩通过找到一个同样困惑孤独的男人/女人的结局来摆脱孤独。因为这等于模糊了根本的焦点,承认一个人存在的所有意义取决于另一个人是否把爱给你。而当对方把爱给你的时候,问题又来了:我是不是Ta最爱的人....

More...

Golang中的反射

 
  1. 概述 Go语言提供了一种机制,能够在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,而不需要在编译时就知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。 2. 反射类型对象 使用reflect.TypeOf() 函数获取任意变量的类型对象 reflect.Type **函数的源码如下 : ** // TypeOf returns the reflection Type that represents the dynamic type of i. // If i is a nil interface value, TypeOf returns nil. func TypeOf(i interface{}) Type { eface := *(*emptyInterface)(unsafe.Pointer(&i)) return toType(eface.typ) } 通过获取的类型对象就能访问原变量的类型信息 在类型信息中我们需要知道 类型(Type) 和 种类(Kind)的区别 类型 Type : 通....
More...

不必读

 

绝大多数的中国古典小说 这么说会激起很多人的强烈反感,但小说真的不是我们的强项。具体原因这里就不展开了。 除了四大名著,《金瓶梅》、《儒林外史》、《聊斋》、《三言二拍》等以外,好的真是不多了。比如《封神演义》,人物刻板,情节单一,思想陈腐,盛名之下,其实难负。 绝大多数的从“五四”到1949年的中国现代文学作品 我很佩服开天辟地的现代文学先贤们,他们的功劳永垂不朽,但这是从文学史的角度说的。 除了鲁迅、沈从文、老舍、张爱玲、曹禺等少数几位,总体上真的比较幼稚,从普通读者的角度,真的看不下去。 绝大多数从1949年到1976年的中国当代文学作品 我基本上全部看过,有绝对的发言权。 这段时期的作品,非文学的因素占比例太大,而这些非文学因素也已经时过境迁,今非昔比,所以,不必像我们小时候那样饿急了什么都吃,捡到碗里都是菜了。 绝大多数的当代中国人写的历史小说 历史小说是最难写的小说之一,需要经历、学识、性情、沉浸,最吃细节、韵味、笔力、文字功夫。 这些对于当代中国人来说,尤其困难。比如有一位非常有名的历史小说作家,描写一位晚清宦海沉浮几十年的封疆大吏: “激动得两眼闪动着泪花”;“激动地握着....

More...