程序源代码基本元素介绍

相比很多其它流行语言,Go的语法相对简洁。 此篇文章将介绍编程中常用的代码元素,并展示一份简单的Go程序代码,以便让刚开始学Go编程的程序员对Go代码结构有一个大概的印象。

编程和程序代码元素

简单来讲,编程可以看作是以各种方式控制和组合计算机运行中的各种操作,以达到各种各样的目的。 一个操作可能从一个硬件设备读取、或者向一个硬件设备写入一些数据,从而完成一个特定的任务。 对于现代计算机来说,最基本的操作是底层计算机指令,比如CPU和GPU指令。 常见的硬件设备包括内存、磁盘、网卡、显卡,显示器、键盘和鼠标等。

直接操控底层计算机指令进行编程是非常繁琐和容易出错的。 高级编程语言通过对底层指令进行一些封装和对数据进行一些抽象,从而使得编程变得直观和易于理解。

在流行高级编程语言中,一个操作通常是通过函数(function)调用或者使用操作符(operator)运算来完成的。 大多数高级编程语言都支持一些条件和循环控制语句。 这些条件和循环控制语句可以看作是特殊的操作。 它们的语法接近于人类语言,因此一个人写的代码很容易被其他人理解。

在大多数高级编程语言中,数据通常被抽象为各种类型(type)和(value)。 一个类型可以看作是值的模板。一个值可以看作是某个类型的实例。 大多数编程语言支持自定义类型和若干预定义类型(即内置类型)。 一门语言的类型系统可以说是这门语言的灵魂。

编程中常常会使用大量的值。 一些在编码阶段可确定的值可以用它们的字面形式(literal,即字面量)来表示。 为了编程灵活和不易出错,其它的值一般使用变量(variable)和(有名)常量(named constant)来表示。

在《Go语言101》中,有名字的函数、有名字的值(包括变量和有名常量)、以及定义类型和类型别名将被统称为资源。 资源名必须为。

高级编程语言代码将被编译器或者解释器转换为底层机器码进行执行。 为了帮助编译器和解释器解析高级语言代码,一些单词将被用做关键字(keyword)。 这些单词不能被当做标识符使用。

很多现代高级语言使用(package)来组织代码。 一个包必须引入(import)另一个包才能使用另一个包中的公有(导出的)资源。 包名和包的引入名也都必须是标识符。

尽管高级编程语言代码比底层机器指令友好和易懂,我们还是需要一些注释来帮助自己和其他程序员理解我们所写的代码。 在下一节的程序示例中,我们可以看到很多注释。

一个简单的Go示例程序

///**/

下面是这个Go示例程序。请注意阅读其中的注释。程序之后有更多解释。

  1. package main // 指定当前源文件所在的包名
  2. import "math/rand" // 引入一个标准库包
  3. const MaxRand = 16 // 声明一个有名整型常量
  4. // 一个函数声明
  5. /*
  6. StatRandomNumbers生成一些不大于MaxRand的非负
  7. 随机整数,并统计和返回小于和大于MaxRand/2的随机数
  8. 个数。输入参数numRands指定了要生成的随机数的总数。
  9. */
  10. func StatRandomNumbers(numRands int) (int, int) {
  11. // 声明了两个变量(类型都为int,初始值都为0)
  12. var a, b int
  13. // 一个for循环代码块
  14. for i := 0; i < numRands; i++ {
  15. // 一个if-else条件控制代码块
  16. if rand.Intn(MaxRand) < MaxRand/2 {
  17. a = a + 1
  18. } else {
  19. b++ // 等价于:b = b + 1
  20. }
  21. }
  22. return a, b // 此函数返回两个结果
  23. }
  24. // main函数,或主函数,是一个程序的入口函数。
  25. func main() {
  26. var num = 100
  27. // 调用上面声明的StatRandomNumbers函数,
  28. // 并将结果赋给使用短声明语句声明的两个变量。
  29. x, y := StatRandomNumbers(num)
  30. // 调用两个内置函数(print和println)。
  31. print("Result: ", x, " + ", y, " = ", num, "? ")
  32. println(x+y == num)
  33. }
basic-code-element-demo.go
  1. $ go run basic-code-element-demo.go
  2. Result: 46 + 54 = 100? true
packageimportconstfuncvarforifelsereturn
intint1601100"Result: "
MaxRandixyabintinumxyint
<==++
printprintlnStatRandomNumbersIntnmath/rand
printprintlnfmt
mainmainmath/randrandIntn

表达式、语句和简单语句一文中介绍了什么是表达式和语句。特别地,此文列出了所有的简单语句类型。 在Go代码中,各种流程控制代码块中的某些部分必须为简单语句,某些部分必须为表达式。

StatRandomNumbersforif-else

空行常常用来增加代码的可读性。 上面的程序中也包涵了很多注释,但它们大多是为了Go初学者快速理解的目的而加入的。 我们应该尽量使代码自解释,只在确实需要解释的地方进行注释。

关于代码断行

{}{StatRandomNumbers
  1. func StatRandomNumbers(numRands int) (int, int)
  2. { // 编译错误:语法错误
  3. var a, b int
  4. for i := 0; i < numRands; i++
  5. { // 编译错误:语法错误
  6. if rand.Intn(MaxRand) < MaxRand/2
  7. { // 编译错误:语法错误
  8. a = a + 1
  9. } else {
  10. b++
  11. }
  12. }
  13. return a, b
  14. }

一些程序员不是很喜欢这些限制。但是这些限制有两个好处:

  1. 它们使得Go程序编译得非常快。
  2. 它们使得不同的Go程序员编写的代码风格类似,从而一个Go程序员写的代码很容易被另一个程序员看懂。

我们可以阅读代码断行规则一文以获取更多关于代码换行规则的细节。在目前,我们最好避免将左大括号放在下一行。 或者说,每行的非空起始字符不能是左大括号(但是,请记住,这不是一个普适的规则)。