Go从入门到放弃2--Go程序结构

63 阅读4分钟

Go语言和其他编程语言一样,一个大的程序是由很多小的基础构件组成的。变量保存值,简单的加法和减法运算被组合成较复杂的表达式。基础类型被聚合为数组或结构体等更复杂的数据结构。然后使用if和for之类的控制语句来组织和控制表达式的执行流程。然后多个语句被组织到一个个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织。

命名

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线,并且区分大小写。

如果一个名字是在函数内部定义,那么它就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的,那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。包本身的名字一般总是用小写字母。

在习惯上,Go语言程序员推荐使用驼峰式命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔。

变量声明

Go语言沿袭了静态编译型语言的传统:使用变量之前需要先进行变量的声明。 Go语言有两类变量:

  • 包级变量(package variable):在package级别可见的变量。如果是导出变量,则该包级变量也可以被视为全局变量。
  • 局部变量(local variable):函数或方法体内声明的变量,仅在函数或方法体内可见。 我们可以使用关键字var和短变量声明,都可以实现对变量的“声明并赋值”。
var a int32
var s string = "hello"
var i = 13
n := 17 //短变量声明

包级变量只能使用带有var关键字的变量声明形式,局部变量两种方式都可以使用;短变量声明只能被用在函数或者其他更小的代码块中。

常量

在Go语言中,常量是指编译期间就已知且不可改变的值。所有常量表达式的求值计算都可以在编译期而不是在运行期完成,这样既可以减少运行时的工作,也能方便编译器进行编译优化。当操作数是常量时,在编译时也能发现一些运行时的错误,例如整数除零、字符串索引越界等。每种常量的潜在类型都是基础类型:boolean、string或数字。

go使用const关键字来定义常量。

const (
    e  = 2.7182818
    pi = 3.1415926
)

 iota常量生成器

常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

包和文件

Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径。

包还可以让我们通过控制哪些名字是外部可见的来隐藏内部实现信息,在Go语言中,一个简单的规则 是:如果一个名字是大写字母开头的,那么该名字是导出的。

Go使用import关键字进行包导入。

  import "github.com/tidwall/gjson" //通过包名gjson调用导出接
  import json "github.com/tidwall/gjson" //通过别名json调用gjson`
  import . "github.com/tidwall/gjson" //.符号表示,对包gjson的导出接口的调用直接省略包名
  import _ "github.com/tidwall/gjson" //_ 仅仅会初始化gjson,如初始化全局变量,调用init函数

参考资料

  • 《Go语言圣经》
  • 《Go语言精进之路》