Go能实现接口的动态性和反射的基础是:编译期为运行时提供了类型信息。interface底层有两种结构,上一节讲了带方法的iface,这一节补充不带方法的eface结构。 interface之efaceGo中的任何对象都可以表示为interface{}。它扮演的角色与C中的void*差不多,区别在于interface{}中包含有类型信息,可以实现反射。 efece数据结构描述:gcdata域用于垃 ...
Go 方法调用与接口
在比较C++和Go的时候,通常会说到Go不支持继承和多态,但通过组合和接口实现了类似的语言特性。总结一下Go不支持的原因:(1) 首先struct是值类型,赋值和传参都会复制全部内容。struct的内存布局跟C几乎一致,没有任何附加的object信息,比如指向虚函数表的指针。(2)其次Go不支持隐式的类型转换,因此用基类的指针指向子类会编译错误。 Go程序抽象的基本原则依赖于接口而不是实现,优先 ...
Go Slice与String内存布局和实现
上一篇提到的关于gc性能的问题,对比slice和map的结构可以看出为了存储数据map用了更多的内存空间,并且可能存在链表,链表的每个节点在gc时都做为一个小对象对待,增加了扫描的时间,因此gc时间相对更长。 slice初始化与复制slice通过内部指针和相关属性引用数组片段,来实现变长方案。实现方式和数据结构都类似C++中的vector。它本身是结构体,作为参数传递时传递的是slice本身而不是 ...
Go Hashmap内存布局和实现
想了解Go内置类型的内存布局的契机,是一次在调试“不同类型的小对象频繁创建对gc性能的影响”时发现map的gc性能不佳,而作为对比的包含slice的struct却很好。这里总结Go runtime里map的实现,可以解释这个问题。 hash table内部结构Go的map就是hashmap,源码在src/runtime/hashmap.go。对比C++用红黑树实现的map,Go的map是unord ...
Hexo博客搭建与github托管
关于Hexo及基本安装Hexo是一个基于Node.js的静态博客程序,可以方便的生成静态网页托管在github上。 安装Git,安装Node.js。 在安装目录上新建一个Hexo的文件夹,右键Git-bash,开始安装Hexo。 $ npm install hexo -g$ hexo init blog $ cd blog$ npm install $ hexo server 这时Hex ...