Go语言的特点和优势
1.简单易学
Go语言语法简单,包含了类似C语言的语法。如果读者已经掌握了两到三门编程语言,那么学习Go语言只需要几天的熟悉过程。即使一名刚入门的开发者,花几个星期也能写出来性能较高的程序。
2.自由高效
Go语言的编译速度明显优于 Java 和 C++,此外,Go语言还拥有接近C语言的运行效率和接近PHP的开发效率。换言之,Go语言等同于将开发效率和运行效率进行了完美的融合。Go语言支持当前所有的编程范式,其中包括过程式编程、面向对象编程、面向接口编程、函数式编程。开发者们可根据需求自由的组合。
3.强大的标准库
Go中的标准库非常稳定,丰富的标准库覆盖网络、系统、加密、编码、图形等各个方面,尤其是网络和系统的库非常实用。使得开发者在开发大型程序中,几乎无需依赖第三方库。
4.部署方便
Go语言不使用虚拟机,Go语言的代码可以直接输出为目标平台的二进制可执行文件。Go语言有自己的链接器,不依赖任何系统提供的编译器和链接器。因此编译出的二进制可执行文件几乎可以运行在任何的系统环境中。
5.原生支持并发
Go 是一种非常高效的语言,从语言层原生支持并发,使用起来非常的简单。Go的并发是基于Goroutine。Goroutine 类似于线程,但并非线程,是 Go 面向线程的轻量级方法。创建 Goroutine 的成本很低,只需几千个字节的额外内存。通常一台普通的桌面主机运行上百个线程就会负载过大,同样的主机却可以运行上千甚至上万个 Goroutine。Goroutine 之间可以通过Channel实现通信。Goroutine 以及基于Channel的并发性方法可最大限度地使用 CPU 资源。
6.稳定性强
Go拥有强大的编译检查、严格的编码规范,具有很强的稳定性,此外Go还提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、go fmt、go test。
7.垃圾回收
Go语言的使用者只需要关注内存的申请而不必关心内存的释放,Go语言内置Runtime来自动进行管理。虽然目前来说GC(内存垃圾回收机制)不算完美,但是足以应付开发者所能遇到的大多数情况,使开发者将更多精力集中在业务上,同时Go语言也允许开发者对此项工作进行优化。
安装和配置Golang
搭建集成开发环境GoLand
编写第一个程序HelloWorld
新建文件a.go
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
进入文件所在cmd,执行go run a.go
编译go build a.go,会生成a.exe可执行文件,直接点击运行
上述代码解释:
第1行 package main 定义了包名。必须在源文件中非注释的第1行指明这个文件属于哪个包,如package main。package main表示一个可独立执行的程序,每个 Go 应用程序都需要包含一个名为 main 的包。并且在该包包含一个叫main()的函数(该函数是Go可执行程序的执行起点,既不能带参数,也不能定义返回值)。
第2行 import "fmt" ,import语句用于导入该程序所依赖的包。由于本示例程序用到了Println()函数,所以需要导入该函数所属的fmt包。fmt 包实现了格式化 IO(输入/输出)。
第3行 func main() 是程序入口。所有Go函数以关键字func开头,每一个可执行程序所必须包含main 函数,通常是程序启动后第一个执行的函数,如果有 init() 函数则会先执行init()函数。
第4行 /*...*/ 是注释,代表着在程序执行时,这部分代码将被忽略。
第5行 fmt.Println(...) ,将字符串输出到控制台。 除此之外,还有以下几点值得注意。
(1) 只有 package 名称为 main 的包可以包含 main 函数。
(2) 一个可执行程序有且仅有一个 main 包。
(3) 通过 import 关键字来导入其他非 main 包。
(4) 可以通过 import 关键字单个导入,也可以同时导入多个
预定义标识符
预定义标识符是Go语言系统预先定义的标识符,具有见名知义的特点,如函数“输出”(printf)、“新建”(new)、“复制”(copy)等。预定义标识符可以作为用户标识符使用,只是这样会失去系统规定的原意,使用不当还会使程序出错。下面列举了36个预定义标识符,如图所示。
关键字
Go语言的关键字是系统自带的,是具有特殊含义的标识符。Go语言内置了25个关键字用于开发。下面列举了Go代码中会使用到的25个关键字或保留字,如图所示。
自定义标识符
用户根据需要自定义的标识符,一般用来给变量、类型、函数等程序实体起名字。 自定义标识符实际上是一个或是多个字母(A~Z和a~z)、数字(0~9)、下画线(_)组成的序列,但是第一个字符必须是字母或下画线而不能是数字。 Go不允许在自定义标识符中使用@、$和%等标点符号,或预定义标识符和关键字。Go是一种区分大小写的编程语言。因此,Manpower和manpower是两个不同的标识符。 无效的标识符如图所示。
Go语言的编码规范
分隔符
程序中可能会使用到的分隔符:括号()、中括号[]和大括号{}。 程序中可能会使用到的标点符号,如图所示。
可见性规则
Go语言中,使用大小写来决定标识符(常量、变量、类型、接口、结构或函数)是否可以被外部包所调用。 如果标识符以一个大写字母开头,那么其对象就可以被外部包的代码所使用(使用时程序需要先导入这个包),如同面向对象语言中的 public。 如果标识符的对象以小写字母开头,则对包外是不可见的,但是它们在整个包的内部是可见并且可用的,如同面向对象语言中的 private 。
变量声明
初始化变量的标准格式:
未初始化的批量格式,不用每行都用var申明,具体语法格式如下所示:
-
整形和浮点型变量默认值:0
-
字符串默认值为空字符串
-
布尔型默认值为false
-
函数、指针变量、切片默认值为nil
初始化变量的编译器自动推断类型格式:
初始化变量的简短声明格式(短变量声明格式):
使用 := 赋值操作符,:= 可以高效地创建一个新的变量,称之为初始化声明。声明语句省略了var 关键字,变量类型将由编译器自动推断。这是声明变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。该变量名必须是没有定义过的变量,若定义过,将发生编译错误。
多个短变量声明和赋值中,至少有一个新声明的变量出现在左侧中,那么即便有其他变量名可能是重复声明的,编译器也不会报错。情况如下所示。
虽然这种方法不会报错,但是在使用过程中应尽量避免。
变量多重赋值
变量多重赋值是指多个变量同时赋值。Go语法中,变量初始化和变量赋值是两个不同的概念。Go语言的变量赋值与其他语言一样,但是Go提供了其他程序员期待已久的多重赋值功能,可以实现变量交换。多重赋值让Go语言比其他语言减少了代码量。
以简单的算法交换变量为例,传统写法如下所示。
新定义的变量是需要内存的,于是有人设计了新的算法来取代中间变量,其中一种写法如下如下所示。
以Go语言的多重赋值功能为例,写法如下所示。
匿名变量
Go语言的函数可以返回多个值,而事实上并不是所有的返回值都用得上。那么就可以使用匿名变量,用“_”下画线替换即可。
例如,定义一个函数,功能为返回两个int型变量,第一个返回10,第二个返回20,第一次调用舍弃第二个返回值,第二次调用舍弃第一个返回值,具体语法格式如下所示。
匿名变量既不占用命名空间,也不会分配内存。
常量
使用const关键字声明常量,常量的类型可以不写
常量在声明时必须赋值
常量不能修改
常量只能修饰bool、数值类型、string类型
通过首字母的大小写来控制常量的访问范围
数据类型
基本数据类型(原生数据类型):整型、浮点型、布尔型、字符串、字符(byte、rune)。
复合数据类型(派生数据类型):指针(pointer)、数组(array)、切片(slice)、映射(map)、函数(function)、结构体(struct)、通道(channel)。
整型
整型分两大类
有符号整形:int8、int16、int32、int64、int
无符号整型:uint8、uint16、uint32、uint64、uint
其中uint8就是byte型,int16对应C语言的short型,int64对应C语言的long型。
对整型的详细描述,如图所示。
声明方式如下所示。
var a int8 //声明有符号8位整型
var b uint8 //声明无符号8位整型
浮点型
浮点型表示存储的数据是实数,如3.145。关于浮点类型的说明,如表所示。
声明方式如下所示。
var x float32 //声明32位浮点数类型
float32的最大范围是3.4e38,用常量定义是:math.MaxFloat32,在代码中直接使用可以代表最大范围的值。
float64的最大范围是1.8e308,用常量定义是:math.MaxFloat64,在代码中直接使用可以代表最大范围的值。
复数型
复数型用于表示数学中的复数,如1+2j、1-2j、-1-2j等。关于复数类型的说明,如图所示。
布尔型
布尔类型用系统标识符bool表示。在其他编程语言中,对于布尔类型的值定义,非0表示真,0表示假。而在Go语言中,布尔值只可以是常量true或者false。
声明方式如下所示。
var flag bool
布尔型无法参与数值运算,也无法与其他类型进行转换。
字符串
字符串在Go语言中是以基本数据类型出现的,使用字符串就像使用其他原生基本数据类型int、float32、float64、bool一样。
字符串在C++语言中,是以类的方式进行封装,不属于基本数据类型。
有些字符都没有现成的文字代号。所以只能用转义字符来表示 。常用的转义字符如图所示。