从C++到Go(一)

从C++到Go (一)1

在开始之前,我建议你以一个通用的目的(而不是以C++的角度)了解一下Go编程语言。The Go Tour是一个非常棒的资源(虽然在国内无法正常访问)。

Go和C++一样,是一种通用的系统编程语言。对于有经验的C++程序员来说,使用Go语言有一些注意事项。这篇文章讨论了Go和C++之间的差异。

非常重要一点是,这两种语言的思维过程存在一些根本的差异,C++的对象模型基于类和类的继承,而Go的对象模型基于接口

概念差异

  • Go没有带有构造函数和析构函数的类,为了代替类的方法、类的继承层级和虚函数,Go提供了接口。另外,在C++中使用模板的地方,Go可以使用接口。
  • Go提供了垃圾回收机制,程序员既不需要也不能手动回收内存。同时,程序员也不需要关心内存是分配在栈上还是堆上,不需要分别管理std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr或普通指针、野指针。Go的运行时系统会代表程序员处理所有容易出错的代码。
  • Go有指针的概念,但是没有指针运算,因此Go的指针更类似于C++的引用。程序员不能使用Go的指针来遍历字符串。切片(将在以后讨论),可以满足大多数指针运算的需求。
  • Go在默认情况下是安全的,指针不能指向任意的内存(不能乱指)。使用unsafe包可以使程序员在明确要求的情况下绕过Go的某些保护机制。
  • 在Go中,数组是值而不是引用。当数组被用于函数参数时,函数将接收一个数组的拷贝,而不是指向它的指针。然而,在实践中,函数通常使用切片作为参数。切片维护了一些指向底层数组的指针。
  • 字符串被语言提供。他们一旦被创建就不能被修改(不可变对象)。
  • 哈希表被语言提供,他们叫做map(对应于C++中的unordered_map)。
  • 单独执行的线程以及线程间通信的特性被语言提供,这将在以后讨论。
  • 某些类型(例如map和channel,将在以后讨论)通过引用而不是值传递。也就是说,传递一个map给一个函数不会拷贝该map,相应的,如果该函数更改了map,则map会被真正修改。
  • Go不使用头文件。作为代替,每一个源文件都是被定义的的一部分。当包中定义的对象(例如类型,常量,变量,函数)使用大写字母开头的名字,那么这些对象可以在其他导入了该包的文件中可见。
  • Go不支持隐式类型转换。混合使用不同类型进行操作需要强制类型转换。即使两种类型具有相同的底层类型(类型别名)也是如此。
  • Go不支持函数重载和运算符重载。
  • Go不支持constvolatile限定。
  • Go使用nil表示空指针,而C++使用NULL0nullptr (C++11之后)。
  • 习惯上,Go使用多个返回值来报告错误(返回一个或多个结果加上一个错误码)(C++使用trycatchthrow,而Go使用panicrecover)。

  1. 翻译自 https://github.com/golang/go/wiki/GoForCPPProgrammers ↩︎

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页