`
golang
  • 浏览: 28247 次
  • 性别: Icon_minigender_1
  • 来自: OHIO
文章分类
社区版块
存档分类
最新评论

C++程序员的谷歌GO语言速成教程

阅读更多
本文属翻译文章
首发于 http://goroot.org

  • 概念不同点
  • 语法
  • 常量
  • 片(Slices)
  • 建值(Making values)
  • 接口
  • 并发
  • 通道




GO是一个以通用系统语言为设计目标的系统级语言, 如 C++. 以下是针对C++程序员的一些学习拉摘要. 这文章主要讨论GO和C++的不同。

对于更一般的介绍,请另参网站其它文章:

概念不同

    * GO没有带构建器和析构器的类. 取而代之的是继承阶级和虚函数, GO提供接口,下文会详细说明. C++用模板实现
    * Go使用内存回收机制.没有必要也不可能明确地回收内存. 现代处理器中内存回收是为了更高效地编程
    * GO有指针但没有指针运算. 你不能用指针变量来遍历一个字符的各个位
    * GO中数组是优先值. 当数组作为参数使用,函数获得数组的一个拷贝, 而不是指针. 然而在实际应用中一般用片作为参数;片有指向数组的指针;片在下面会详细讨论。
    * 字符串由语言提供,一旦建立就不能再改变.
    * GO提供哈希表,称之类映射(map)
    * 分离的线程执行, 通过通道通讯,也是语言本身集成的.后面会详细讨论.
    * 特定类型 (映射和通道后面会详细说明) 以引用方式传递, 而非值传递. 传递一个映射给函数不会获得函数的一个拷贝, 所以如果函数改变了其值,调用者能看得到. 在C++中可以理解成引用.
    *GO没有头文件.取而代之地把所有文件当成包的一部分. 当包定义了一个以大写开头的对象 (类型、常量、变量、函数),这个对象在所有引用该包的文件中可见
    * Go 不支持隐含类型转换. 不同类型数据进行运算时需要转换
    * Go 不支持函数重载和用户自定义操作符.
    * Go does 常量或可变限定词
    * Go 使用nil而不是C++中的NULL或0作为逻辑非。

句法

声明句法和C++相比相反. 类型写在变量前. 这样声明更容易看清楚

Go                           C++
var v1 int;               // int v1;
var v2 string;            // const std::string v2;  (approximately)
var v3 [10]int;           // int v3[10];
var v4 []int;             // int* v4;  (approximately)
var v5 struct { f int };  // struct { int f; } v5;
var v6 *int;              // int* v6;  (but no pointer arithmetic)
var v7 map[string]int;    // unordered_map<string, int>* v7;  (approximately)
var v8 func(a int) int;   // int (*v8)(int a);

声明通常由关键词前导,然后是名称。关键词为 var, func, const, type之一. 方法声明是很少的例外。

你也可以使用关键词加括号来作一系列的声明。
var (
    i int;
    m float
)
当声明一个函数, 要么为每个参数提供一个名称,要么提供一个名称给任意参数;但不能忽略一部分而只提供一半分参数,你可以把相关类型的参数组织到一起:
func f(i, j, k int, s, t string);
声明时允许初始化. 如果这样做,那么指定类型是允许的,但不是必要的. 如果声明时变量类型没有被指定,那么其类型由初始化的值决定.

var v = *p;

请再参见关于常量的讨论. 如果一个变量没有被明确地初始化, 那么必须声明其类型. 在这种情况下会被隐式初始化为零值(0, nil, 或其它.). 所以Go中没有未被初始化的变量.

函数中,短声明语法可用:= .

v1 := v2;

这等价于

var v1 = v2;

Go 多值平行赋值.

i, j = j, i;   // 交换i j的值.

函数能返回多值, 由括号内的列表表示. 返回值可同时赋值给多个值.
unc f() (i int, j int);
v1, v2 = f();

Go 把分号作为分隔符, 而不是终止标志. 而且, 分号可以被省略如果后面紧跟一个声明块的闭括号或者不是表达式一部分的花括号(如, var s struct {} or { x++ }). 分号在高层的文件中不需要使用(全局声明中). 然而,在语句中他们始终被允许的,所以你依然可以按照C++的规范来写.

当使用指针指向结构体要用 . 而不是 ->. 所以语法上来说一个结构体跟一个指针指向结构体是相同的处理方式.
type myStruct struct { i int }
var v9 myStruct;             // v9 has structure type
var p9 *myStruct;            // p9 is a pointer to a structure
f(v9.i, p9.i)
Go在if语句中不要求括号把条件括起来, for语句的条件式也不要,或者switch语句. 但后面的语句需要用花括号.
if a < b { f() }          // Valid
if (a < b) { f() }        // Valid (condition is a parenthesized expression)
if (a < b) f();           // INVALID
for i = 0; i < 10; i++ {}    // Valid
for (i = 0; i < 10; i++) {}  // INVALID
Go 没有while和do..while语句. for语句可以使用单条件来实现while语句的功能. 忽略终止条件就能实现无休止循环。
Go 允许break和continue指定特定的层次. 但指定的必需是for,if,switch.

在一个switch语句中,case标签不能跳过. 你可以使用fallthrough来跳过. 这适用于相临的语句。
switch i {
case 0:  // empty case body
case 1:
    f()  // f is not called when i == 0!
}
但一个case可以有多个值.
switch i {
case 0, 1:
    f()  // f is called if i == 0 || i == 1.
}
case中的值不需要是常量,或者是偶数; 任何能进行等值比较的类型,如字符串和指针都可以,如果case的值被省略,则默认为真。
 switch {
case i < 0:
    f1()
case i == 0:
    f2()
case i > 0:
    f3()
}
++ --操作符只能用在语句中,不能用在表达式中. 不能写 c = *p++. 而*p++ 会被解释为 (*p)++.

defer语句用来调用一个函数,当一个函数包含了defer语句的返回值.
fd := open("filename");
defer close(fd);        // fd will be closed when this function returns.
常量 [Top]

Go中的常量可以不指定类型. 这同样可以应用到用 const 声明的常量上, 如果声明时没有指定类型,并且在初始化时使用不指定类型的赋值. 一个常量会被自动添加上类型当它进行某种要求特定类型运算时. 这允许常量相对自由地使用而无需明确地进行类型转换.
var a uint;
f(a + 1)  // untyped numeric constant "1" becomes typed as uint
语言不限制未指定类型的数字常量或常量表达式的大小. 只有当常量被应用在某种要求特定类型的数据操作时,常量的大小才会被限定.
const huge = 1 << 100;
f(huge >> 98)
Go 不支持枚举. 但是相应地,你可以使用在一个单常量声明中使用iota来获得一系列递增的值. 当一个常量的初始化表达化被省略了,它会重用前面的表达式.
const (
    red = iota;  // red == 0
    blue;        // blue == 1
    green        // green == 2
)
片[Top]

片在概念上是具有三个域的结构: 指向数组的指针, 长度, 容量. 片支持使用 [] 操作符来获得指向数组的元素. 内建len 函数返回片的长度. 内建cap函数返回容量.

给定一个数组,或者另一个片,一个片通过a[I:J]来创建. 这样创建了一个指向a的片引用,开始于索引I,终止于索引J之前. 长度为J-I.新片指向与a相同的数组.也就是说,改变新片的内容在a数组也可见 . 新片的容量等于a的容量减去I. 数组的容量是数组的长度. 你也可以赋一个数组指针给一个片; 给定 var s []int; var a[10] int, 赋值 s = &a 等同于 s = a[0:len(a)].
。。。。翻译中,未完待续。。。。
分享到:
评论

相关推荐

    C++程序员面试技巧.pdf

    C++程序员面试技巧.pdf,C++程序员面试技巧.pdf

    1. C++程序员python速成.ppt

    C++ 程序员 Python 速成 Python 作为一种广泛使用的编程语言,具有简洁易用的语法和庞大的标准库。作为 C++ 程序员,学习 Python 的基础语法和数据类型是非常必要的。本文将对 Python 的基础语法和数据类型进行详细...

    C++ 程序员成长中最常走的 4 条弯路

    在C++程序员的成长道路上,经常会遇到一些常见的误区和弯路,这些弯路不仅会浪费大量时间,还可能阻碍技能的真正提升。以下是C++程序员在成长过程中最常走的四条弯路,以及如何避免它们。 ### 弯路一:通过MS-VC++ ...

    c或c++语言程序员面试精选

    在C和C++编程语言的世界里,面试是评估潜在程序员技能的关键环节。"C或C++语言程序员面试精选"提供了一份宝贵的资源,旨在帮助开发者准备面试,并深化对这两种语言的理解。这份文档不仅适用于正在寻找工作的程序员,...

    C/C++程序员面试宝典

    C/C++是最能体现程序员能力的语言之一,其功能强大,在IT行业的各个方面都有大量的应用。一名优秀的C/C++程序员无疑是众多企业所渴求的。本书写作的目的就是为C/C++程序员的求职提供一些参考,让他们能够正确地面对...

    C++程序员UML实务手册

    《C++程序员UML实务手册》是一本专为C++开发者设计的指南,旨在帮助他们理解和应用统一建模语言(Unified Modeling Language,简称UML)进行软件开发。这本书由台湾的邱郁惠撰写,提供了丰富的实例和代码,使得理论...

    C和C++程序员面试秘笈

    根据给定的标题“C和C++程序员面试秘笈”以及描述“C和C++程序员面试秘笈”,我们可以推断出这份文档旨在为准备参加C或C++编程岗位面试的求职者提供指导与帮助。虽然提供的具体内容部分重复提及了一个网站地址,并...

    《C++程序员速成》第5章

    在《C++程序员速成》第5章中,我们聚焦于C++中的一个重要部分——标准模板库(Standard Template Library,简称STL)。STL是C++编程中的一个强大工具,它提供了一系列高效、泛型的容器、算法和迭代器,极大地简化了...

    典型的C++程序员成长经历

    总的来说,一个典型的C++程序员的成长过程涉及到从基础语言特性到高级设计原则和库的全面学习。这个过程中,程序员会不断探索、实践和反思,以提升代码质量,优化性能,并创建出可复用和可扩展的组件,从而能够编写...

    如何成为程序员如何成为一名C++程序员(看完深受启发)

    在当今快速发展的信息技术领域,成为一名出色的C++程序员不仅意味着掌握一门编程语言,更是一项能够开启众多职业机会的关键技能。本篇文章将深入探讨如何从零基础开始逐步成长为一名合格的C++程序员,并在此过程中...

    C_C++程序员Java编程

    在IT行业中,C++和Java是两种非常重要的编程语言,它们各自有着独特的特性和应用场景,同时也存在着一定的交集。对于已经熟悉C或C++的程序员来说,学习Java编程可以拓展其技术栈,增强其在软件开发领域的竞争力。...

    C++程序员必读书目清单

    2. 《C++ template》:全面的C++模板参考手册和教程,强调实际应用,通过真实案例帮助程序员掌握模板的使用。 3. 《Modern C++ design(现代C++设计)》:Andrei Alexandrescu的创新之作,引入了联合设计模式和泛型...

    C++程序员设计_pdf(整合版 c++资料

    《C++程序员设计》这本书是为那些希望深入理解C++编程语言、提升设计能力的程序员量身打造的宝贵资源。整合版的PDF资料包含了全面的知识点,旨在帮助读者掌握C++的核心概念,优化代码设计,并了解如何在实际项目中...

    C~C++程序员实用大全

    总的来说,《C~C++程序员实用大全》是一本全面覆盖C和C++语言的教程,适合初学者入门,也对有经验的开发者有很高的参考价值。通过系统学习,读者不仅可以熟练掌握这两种语言,还能培养出良好的编程习惯和问题解决...

    成为优秀的c++程序员各阶段必读书籍整理PDF格式

    个人整理的c++程序员各阶段应该读的书籍 包括effective c++, more effective c++, thinking in c++, exceptional c++, more exceptional c++, c++语言的设计和演化,深度探索c++对象模型

    C++程序员的婚礼

    ### C++程序员的婚礼——一场别开生面的友元关系结成典礼 #### 背景介绍 本文档描述了一场独特的婚礼仪式,名为“C++程序员的婚礼”,旨在纪念两位程序员达瑞(Darren)和卡娜(Katrina)。这场婚礼不仅仅是一场...

    如何成为一名C++程序员

    【如何成为一名C++程序员】 成为一名C++程序员是一个逐步深入的过程,需要掌握编程基础、提高编程技巧,以及不断提升设计思想。以下是一份详细的指南: 1. **入门阶段**: - 初步理解编程思维,通过编写小程序...

    C和C++程序员面试秘笈.pdf

    C和C++程序员面试秘笈.pdf

Global site tag (gtag.js) - Google Analytics