Reference:

  • Github: Go
  • Github: The way to Go

Go程序的基本结构和要素

helloworld.go:

package mainimport "fmt"func main() {fmt.Println("hello, world")
}

package

包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。

每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成。

package = 1.go + ...

你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

一个应用程序可以包含不同的包,而且即使你只使用 main 包也不必把所有的代码都写在一个巨大的文件里:你可以用一些较小的文件,并且在每个文件非注释的第一行都使用 package main 来指明这些文件都属于 main 包。

标准库

在 Go 的安装文件里包含了一些可以直接使用的包,即标准库。

Go 的标准库包含了大量的包(如:fmt 和 os),但是你也可以创建自己的包(第 8 章)。

如果对一个包进行更改或重新编译,所有引用了这个包的客户端程序都必须全部重新编译。

显式依赖关系编译机制:

如果 A.go 依赖 B.go,而 B.go 又依赖 C.go

  • 编译 C.go, B.go, 然后是 A.go.
  • 为了编译 A.go, 编译器读取的是 B.o 而不是 C.o.

这种机制对于编译大型的项目时可以显著地提升编译速度。每一段代码只会被编译一次。

import

一个 Go 程序是通过 import 关键字将一组包链接在一起。

import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。包名被封闭在半角双引号 "" 中。

import ("fmt""os"
)

如果包名不是以 . 或 / 开头,如 "fmt" 或者 "container/list",则 Go 会在全局文件进行查找;如果包名以 ./ 开头,则 Go 会在相对目录中查找;如果包名以 / 开头(在 Windows 下也可以这样使用),则会在系统的绝对路径中查找。

除了符号 _,包中所有代码对象的标识符必须是唯一的,以避免名称冲突。但是相同的标识符可以在不同的包中使用,因为可以使用包名来区分它们。

可见性原则("public" and "private")

包通过下面这个被编译器强制执行的规则来决定是否将自身的代码对象暴露给外部文件:

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )。

函数

函数声明:

func functionName()

main 函数是每一个可执行程序所必须包含的。

main 函数既没有参数,也没有返回类型。

在程序开始执行并完成初始化后,第一个调用(程序的入口点)的函数是 main.main()(如:C 语言),该函数一旦返回就表示程序已成功执行并立即退出。

左大括号 { 必须与方法的声明放在同一行,这是编译器的强制规定。Go 语言虽然看起来不使用分号作为语句的结束,但实际上这一过程是由编译器自动完成。

函数定义:

func functionName(parameter_list) (return_value_list) {…
}// parameter_list 的形式为 (param1 type1, param2 type2, …)
// return_value_list 的形式为 (ret1 type1, ret2 type2, …)

只有当某个函数需要被外部包调用的时候才使用大写字母开头,并遵循 Pascal 命名法;否则就遵循骆驼命名法,即第一个单词的首字母小写,其余单词的首字母大写。

注释

单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

每一个包应该有相关注释,在 package 语句之前的块注释将被默认认为是这个包的文档说明,其中应该提供一些相关信息并对整体功能做简要的介绍。

如果这种注释(称为文档注释)出现在函数前面,例如函数 Abcd,则要以 "Abcd..." 作为开头。

类型

类型可以是基本类型,如:int、float、bool、string;结构化的(复合的),如:struct、array、slice、map、channel;只描述类型的行为的,如:interface。

结构化的类型没有真正的值,它使用 nil 作为默认值。

函数也可以是一个确定的类型,就是以函数作为返回类型。

一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 () 将它们括起来,如:

func FunctionName (a typea, b typeb) (t1 type1, t2 type2)

使用 type 关键字可以定义你自己的类型。

type IZ int
var a IZ = 5

每个值都必须在经过编译后属于某个类型(编译器必须能够推断出所有值的类型),因为 Go 语言是一种静态类型语言

Go 程序的一般结构

结构:

  • 在完成包的 import 之后,开始对常量、变量和类型的定义或声明。
  • 如果存在 init 函数的话,则对该函数进行定义(这是一个特殊的函数,每个含有该函数的包都会首先执行这个函数)。
  • 如果当前包是 main 包,则定义 main 函数。
  • 然后定义其余的函数,首先是类型的方法,接着是按照 main 函数中先后调用的顺序来定义相关函数,如果有很多函数,则可以按照字母顺序来进行排序。
// go template
package mainimport ("fmt"
)const c = "C"var v int = 5type T struct{}func init() { // initialization of package
}func main() {var a intFunc1()// ...fmt.Println(a)
}func (t T) Method1() {//...
}func Func1() { // exported function Func1//...
}

Go 程序的执行(程序启动)顺序如下:

  • 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
  • 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次
  • 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数。
  • 在完成这一切之后,main 也执行同样的过程,最后调用 main 函数开始执行程序。

类型转换

类型 B 的值 = 类型 B(类型 A 的值)

a := 5.0
b := int(a)

当从一个取值范围较大的转换到取值范围较小的类型时(例如将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。

命名规范

干净、可读的代码和简洁性是 Go 追求的主要目标。

通过 gofmt 来强制实现统一的代码风格。

Go 语言中对象的命名也应该是简洁且有意义的。

名称不需要指出自己所属的包,因为在调用的时候会使用包名作为限定符。

返回某个对象的函数或方法的名称一般都是使用名词,没有 Get... 之类的字符,如果是用于修改某个对象,则使用 SetName。有必须要的话可以使用大小写混合的方式,如 MixedCaps 或 mixedCaps,而不是使用下划线来分割多个名称。

2017.8

The way to Go(6): Go程序的基本结构和要素相关推荐

  1. 批量下载ABAP程序和表结构

    REPORT YGJH003 NO STANDARD PAGE HEADING LINE-SIZE 200 MESSAGE-ID WA. ******************************* ...

  2. QML 编程之旅 -- QML程序的基本结构概念

    文章目录 QML 文档的构成 QML基本语法 QML 编程之旅 – QML程序的基本结构概念 学习Qt编程快近一年了,的确是项目驱动,让我不得不咬紧牙关,需要快速的学习掌握一门新的技术.编程是一个非常 ...

  3. C语言程序的基本结构

    文章目录 一.C语言基础知识的学习方法 二.C语言程序开发的流程 三.安装C语言的编译器 四.C程序的基本结构 1.程序的注释 2.预处理指令 3.主函数的入口 4.主函数体 五.编译并执行 C 程序 ...

  4. 《Android UI基础教程》——1.2节Android 应用程序的基本结构

    本节书摘来自异步社区<Android UI基础教程>一书中的第1章,第1.2节Android 应用程序的基本结构,作者 [美]Jason Ostrander,更多章节内容可以访问云栖社区& ...

  5. python在哪些控制结构中使用else保留字_python的程序控制结构-循环结构与random库使用和圆周率案例--pyt...

    python的程序控制结构-循环结构与random库使用和圆周率案例--pyt python的程序控制结构-循环结构与random库使用和圆周率案例--python-7-days 循环结构 - for ...

  6. C语言程序设计基础之结构

    在实际问题中,一组数据往往具有不同的数据类型.例如, 在学生登记表中,姓名应为字符型:学号可为整型或字符型: 年龄应为整型:性别应为字符型:成绩可为整型或实型. 显然不能用一个数组来存放这一组数据. ...

  7. Java 控制台程序的基本结构测试分析草稿

    Java 控制台程序的基本结构测试分析 19 xon 继续

  8. Flask程序的基本结构

    Flask程序的基本结构 @(Flask) 初始化 程序实例是Flask类的对象. 常常用的代码是: from flask import Flask app = Flask(__name__) Fla ...

  9. for循环的说课c语言,教学设计《程序的循环结构-For循环语句》

    一.教学对象 本教案适用于新课程标准下高中一年级学生,教材选用广东版信息技术选修模块一<算法与程序设计>2.4.1节,1课时.在学习本课之前,学生应掌握VB程序的编程环境与运行方法,了解顺 ...

最新文章

  1. jdbc mysql查询显示图片_在实现JDBC时如何显示存储引擎-MySQL CONNECTION查询?
  2. 拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
  3. Dockerfile----ubuntu-java
  4. JavaScript之面向对象学习四原型对象的动态性
  5. [置顶] java除0问题探究
  6. vmware虚拟机磁盘挂载
  7. 蓝桥杯2018年第九届C/C++省赛B组第六题-递增三元组
  8. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程...
  9. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
  10. python读取svg转emf_玩玩矢量图标,SVG转换EMF
  11. java 412_http 412问题
  12. 银行柜员绩效考核案例
  13. solaris 9 一般安全设置
  14. 在Unity上实现目标识别
  15. Oracle报错ORA-01507: ??????
  16. EventBus的介绍
  17. TrueLicense实现产品License验证
  18. Java编辑器IDEA的下载与安装
  19. 2022年商标注册需要多长时间?
  20. QT在Windows下检测USB设备热拔插的思路

热门文章

  1. 一举打败16个同类模型,视频超分比赛冠军算法入选CVPR 2022,来自商汤南洋理工大学...
  2. Nature年度十大杰出论文公布:机器狗算法、近室温超导等入选,复旦中科院上榜...
  3. Java并发编程:线程池
  4. 5、Makefile基础知识汇总(转自陈皓总述)
  5. Java基础——类和对象的使用
  6. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
  7. 关于xml的一些知识,DTD,XSD
  8. (紀錄)[ASP.NET MVC][jQuery]-1 純手工打造屬於自己的 jQuery GridView
  9. Java EE WEB工程师培训-JDBC+Servlet+JSP整合开发之13.Form表单处理(1)
  10. 架构师之路 — 分布式系统 — 分布式事务难题