转载: C++ vs Go 特性
6:接口,自定义类型与方法
1 class Graph
2 {
3 public:
4 int GetWidth();
5
6 int GetHeight();
7
8 virtual void Draw();
9 private:
10 int width;
11 int height;
12 }
我一直不喜欢C++的这种的方式,因为把一大堆的函数和数据放在一起,这样当代码多了以后将会变得很混乱,而且因为虚函数的存在,在进行初始化的时候不能直接用memset或者memcpy,如果一个类中有几百个变量,那么我们需要一个个去手动初始化,不像C语言里面,数据结构都是原生的值,可以直接memset初始化,go里面则是自动帮我们零值初始化
实际上有了解C++的应该知道,上面的这个类编译器在生成代码的时候还是帮我们进行了分开,比如GetAge()会变成GetAge(Person &person),在go里面则是将一个类分成三个部分,数据,方法与接口
1 type Graph struct{
2 width int;
3 height int;
4 }
5
6
7 func (g *Graph)GetWidth()(int){
8 return g.width;
9 }
10
11 func(g *Graph)GetHeight()(int){
12 return g.height;
13 }
14
15 func(g *Graph)Draw(){
16 fmt.Printf("graph draw");
17 }
18
19 type graph_interface interface{
20 Draw()
21 }
22
23 func Draw(g graph_interface){
24 g.Draw();
25 }
interface就是声明了一个接口,就是类似与虚函数的vptr,可以把type graph_interface interface这句理解成某个把函数加入虚函数表,使用这个接口就可以调用传入的参数的Draw这个函数(C++虚函数的实现原理也是利用这个方法)
在函数声明前面加上(g *Graph)就可以把类的数据与这些方法绑定在一起,其他也没什么好说的了,公有和私有数据或者函数都是利用大小写来区分的,不过go里面跟C++不同,C++如果是private的话其他类就不能访问这个变量或者函数,而go则是其他文件不能访问,本文件还是可以访问,有点类似于C的static
“烂程序员关心的是代码。好程序员关心的是数据结构和它们之间的关系。”
git的设计其实非常的简单,它的数据结构很稳定,并且有丰富的文档描述。事实上,我非常的赞同应该围绕我们的数据结构来设计代码,而不是依据其它的,我认为这也是git之所以成功的原因之一[...]依我的观点,好程序员和烂程序员之间的差别就在于他们认为是代码更重要还是数据结构更重要。
我想C++的程序员要看看这篇文章:http://www.aqee.net/torvalds-quote-about-good-programmer/
将数据结构和这些方法分开将会更有助于程序员去理清数据结构与函数的关系
来源: https://studygolang.com/articles/580

浙公网安备 33010602011771号