每一种编程语言都有自己的语法、结构以及自己的风格,这也是每种语言展现各自魅力及众不同的地方。Go也不例外,它简单而优雅,与此同时使用起来也很有趣。在本文中,我们将讨论以下几点:

  • Go程序结构

  • 如何运行Go程序

  • Go中的注释

  • 分号

  • 代码回顾

Go程序结构

要理解Go程序的结构,首先需要有一个Go程序,让我们重温一下最受欢迎的Hello, World!程序。

package main

import "fmt"

func main() {

fmt.Println("Hello,World!")

}

每个源文件(扩展名为.go的文件)必须有一个包声明。在上面的helloworld.go文件中,第一行声明了包main,其含义是告诉编译器这个源文件将包含go的入口点,是主函数。main包的声明和main函数的组合使其成为独立的、可执行的Go程序。

在我们的代码中,我们将信息写入控制台,这是一个标准输出。为此,要使用import关键字导入fmt包。fmt包是format单词的缩写,它与Go标准库一起提供给开发人员。fmt包提供了许多写入到标准输出的方式(类似fmt.Println的一系列变种)。此外,稍后可以看到导入多个包场景。

如何运行Go程序

我们可以使用go run或go build命令运行任何Go程序。使用这些命令可以指示Go编译器编译和运行Go代码。要运行上面的Hello World程序,可以在程序文件当前目录中使用go run helloworld.go命令。

go run helloworld.go

我们还可以使用go build命令,该命令将生成一个名为helloworld的可执行文件,该文件可以像任何其他exe可执行文件一样执行。命令如下:

go build

如果出于某种原因,我们想要更改可执行文件的名称,那么可以使用go build -o 命令来更改。这将创建一个具有指定的名称的可执行二进制文件。例如:

$ go build -o exe  #being in thehello-world directory

$ ./exe            # running theexecutable

Hello, World!

根据需要,我们可能想要安装应用程序。为此,可以使用go install <package-name> 命令。这将创建一个二进制可执行文件,并将其存储在$GOPATH/bin目录中。因此,确保设置了GOBIN并将其添加到PATH环境变量中。此外,如果设置了PATH环境变量,可以在系统的任何地方运行该二进制文件。如下所示:

go install helloworld

Go中的注释

在合适的位置向代码中添加注释与编写高质量的、可维护的代码同样重要。在Go中,注释不仅仅是在代码中添加内联解释的一种方式,它也是将api文档化的一种方式,我们在讨论函数时将看到这一点。

有两种方法可以在代码中添加注释:行注释或块注释。要添加行注释,只需以//开头,后面跟着注释掉的文本。要添加块注释,我们在/*和*/符号之间换行文本。以下是例子:

// package main defines the entry point

package main

// import the 'fmt' package from standard library

import "fmt"

/*

The main function is the entrypoint in a Go program.

The main function does not havea return type.

Also, it does not accept anyparameters.

*/

func main() {

fmt.Println("Hello,World!")

}

分号

正如在上面的代码中所看到的,我们的代码中没有使用任何分号。那是因为Go会在幕后实现这些。与C语言一样,Go的语法也使用分号来终止语句,但它们不必出现在源代码中。

Go的文档是这样说的:

与C语言一样,Go的正式语法使用分号来终止语句,但与C语言不同的是,这些分号不会出现在源代码中。相反,词法分析程序使用一个简单的规则在扫描时自动插入分号,因此输入文本基本上不需要分号。

大致规则如下:如果换行符之前的最后一个标记是一个标识符(包括int和float64这样的单词),一个基本的文字(如数字或字符串常量),或一个特殊指令(如break/continue/fallthrough/return/++/--)。词法分析程序总是在以上指令后面插入分号。可以总结为:“如果换行符出现在可以结束语句的标记之后,那么插入一个分号”。分号也可以在右大括号前省略,因此诸如break/continue/fallthrough/return/++/--等不需要分号。

要阅读更多关于内部的内容,请继续阅读go官方文档。

代码回顾

正如所述,每个独立应用程序都必须有一个package main的声明,而带有这种声明的.go文件必须有一个main函数。这个main函数是应用程序的入口点,就像在其他编程语言(如C、Java、c#等)中一样。

区别在于,在Java或c#中,main函数可以接受参数,如(string[]args);而在Go中,main函数不接受任何参数,而且main函数不返回任何数据。

注意以下代码是如何导入fmt包的:import “fmt”。此语法仅在导入单个包时有效。如果想导入多个包,那么需要在import()中将包分组。下面是一个例子:

// importing multiple packages in Go

import (

"context"

"database/sql"

"fmt"

"log"

)

注意上面代码中在任何导入包的末尾没有分号,这将由词法分析器来完成。

总结

Go有一个非常简单的程序结构,感觉读起来更像c。遵循相同的模式,将main函数作为应用程序的入口点。Go提供了一种方便的方法来编写简洁的代码,自动且巧妙地在合适位置插入分号。Go提供了不同的注释类型在代码中作描述(与多种主流语言一致),并且能基于注释快速构建文档。

为了更好地理解幕后的技术细节以及如何在Go中编写高质量的代码,强烈建议阅读Go文档中Effective Go页面。

原文作者:Gaurav Gahlot  译者:江玮

原文链接:https://dzone.com/articles/structure-of-a-go-program?fromrel=true

版权声明:本文版权归作者(译者)及公众号所有,欢迎转载,但未经作者(译者)同意必须保留此段声明,且在文章页面明显位置给出,本文链接如有问题,可留言咨询。

Go语言程序结构分析初探的更多相关文章

  1. Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB

    Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...

  2. 第一个C语言程序

    从第一个C语言程序了解C语言 了解关键字 了解函数 注释 C语言的执行流程 标识符 C语言的学习重难点 从第一个C语言程序了解C语言 上图是一个在控制台上显示“Hello, World!”的C语言源代 ...

  3. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  4. 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...

  5. VisualStudio基本使用(2)-使用VS2013来编译C语言程序

    切换到C语言程序所有目录,执行cl test.c

  6. 03-第一个C语言程序的分析

    本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语 ...

  7. C语言学习-01第一个C语言程序

    一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...

  8. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  9. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...

随机推荐

  1. Log4Net web.config配置

     1 .[assembly: log4net.Config.XmlConfigurator(ConfigFile = "web.config", Watch = true)]  写 ...

  2. Python:每日一题002

    题目: 企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万 ...

  3. java 多线程 同步 观察者 并发集合的一个例子

    //第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springfram ...

  4. Spring遇到的问题合集

    2018-09-15 元素 "tx:annotation-driven" 的前缀 "tx" 未绑定. 后来我加了 http://www.springframew ...

  5. playframework链接MySQL数据库的问题

    Scala 在米国已经发展的如火如荼,有些人甚至说Scala将成为未来语言的头号交椅.简洁的代码和表达式的写法让很多人倍感舒适,函数式和面向对象的编程范式也让其能在多种场合游刃有余的被使用.加之它是跑 ...

  6. frp使用笔记

    参考文档: https://github.com/fatedier/frp/blob/master/README_zh.md#%E9%80%9A%E8%BF%87-frpc-%E6%89%80%E5% ...

  7. Oracle中为表设置自动增长的标识列

    -- Create sequence create sequence INNERID minvalue 1 maxvalue 99999999999999 start with 1 increment ...

  8. ios Block详解

    一. iOS代码块Block 1.1 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值, ...

  9. OC 中property的使用

    property在使用的时候需要在其前面加上@符号,需要将其写在类的头文件中 当在定义一个对象的属性变量时,例如定义一个Person类中的name属性,可定义为: @property (nonatom ...

  10. 添加自己的component

    在之前讲解esp-idf的文件结构时,曾经讲过component是esp-idf集成的功能块,这篇文章就来讲解下,如何在esp-idf 中添加自己的component. STEP1; 创建compon ...