学习一门语言,首先要明确这门语言的特性,以及为何学习
首先是摩尔定律几近失效,由于越往后发展,制程工艺越先进,集成程度也越来越高,但是所带来的代价就是每一次新型制程工艺的开发都要面临更高的难度和更大的经济压力,因此多核服务器成为了主流,以往的编程语言都是在单核的基础上创造出来的,多核处理器诞生之后,就应该有一门编程语言来更好的融合多核处理器,GO应运而生。
随着程序规模的不断增大,编译速度会越来越慢如何快速地编译程序是程序员的迫切需求,因为最近十年来,C语言家族没有新的编程语言诞生,而且他在计算领域的发展也越来越慢,因此在开发程度和编译速度很难做到平衡,要么像C++一样执行效率高但是较差的编译和开发速度,要么就像JAVA,.NET一样编译速度快,但是执行效率很低,所以需要有一个编译速度和执行效率都很平衡的语言——GO语言
package main
import "fmt"
func main() {
fmt.pritf("hello, world. 你好, 世界! \n")
}
第一行定义一个包,包名为main,main是可执行程序的包名,所有的Go源程序文件头部必须有一个包声明语句,Go通过包来管理命名空间
第三行import引用一个外部包fmt,可以是标准库的包,也可以是第三方或者自定义的包,fmt是标准输入/输出包
第五行使用func关键字声明定义一个函数,函数名为main,main代表Go程序入口函数
第六行调用fmt包里面的Printf函数,函数实参是一个字符串字面量,在标准输出里面打印一句话“Hello,world. 你好,世界!”,\n是一个转义符,表示换行
首先是现代高级操作语言的源程序内部的几个概念:token,关键字,标识符,操作符,分隔符和字面量
token是构成源程序的基本不可再分割单元,编译器编译源程序的第一步就是将源程序分割为一个一个独立的token,这个过程就是语法分析,Go语言的token可以分为关键字、标识符、操作符、分隔符和字面常量等。
那么Go语言里的token是怎么分割的呢?Go的token分隔符有两类,一类是操作符,一类是自身没有特殊意义,仅仅用来分割其他token,被称作纯分隔符。
sum:=a+b
“:=”和“+”即是分隔符,也是token,所以这个简单的语句被分割为5个touken:“sum”、“:=”、“a”、“+”、“b”
package main
这是一个包声明的语句,package和main之间可以有任意多个空格或者制表符,Go编译器会将其作为一个分隔符处理,最后分理处两个token:package和main。
编程语言的标识符用来表示常量、类型、变量等语法对象的符号名称,其在语法分析中作为一个token存在。编程语言的标识符总体上分为两类:一类是语言设计者预留的标识符(预声明的标识符),一类是编程者可以自定义的标识符(用户自定义的标识符)。前者一般由语言设计者确定,包括语言的预声明标识符及用于后续语言扩展的保留字;后者是用户在编程过程中自行定义的变量名、常量名、函数名等一切符合语言规范的标识符。有一点需要注意,用户自定义的标识符不应该是用语言设计者的预留标识符,这可能导致歧义,并严重影响代码的可读性
Go的标识符构成规则:开头第一个字符必须是字母或者下划线,并且区分大小写
Go语言预声明的标识符包括关键字、内置数据类型标识符、常量值标识符、内置函数和空白标识符。在写Go源程序的过程中,用户自定义标识符用在包名、函数名、自定义类型名、变量名和常量名上
关键字:是指语言设计者保留的有特定语法含义的标识符,这些关键字有自己独特的用途和语法含义,他们一般用来控制程序结构,每个关键字都代表不同语义的语法糖,Go语言是一门极简的语言,只有如下25个关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
这25个关键字又可以按照功能分为三个部分
package //定义包名的关键字
import //导入包名的关键字
const //常量声明的关键字
func //函数定义的关键字
defer //延迟执行的关键字
go //并发语法糖关键字
return //函数返回的关键字
struct //定义结构类型关键字
interface //定义接口类型关键字
map //声明或创建map类型关键字
chan //声明或创建通道类型关键字
if else //if else语句关键字
for range break continue //for循环使用的关键字
switch select type case default fallthrough //switch和select语句使用的关键字
goto //goto跳转语句的关键字
这些都是开发者预声明的关键字,编程者在编程过程中不应该在声明和关键字相同的标识符
内置数据类型标识符(20个):
数值(16个)
整数(12个)
byte int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
浮点型(2个)
float32 float64
复数型(2个)
complex64 complex128
字符和字符串型(2个)
string rune
接口型(1个)
error
布尔型(1个)
bool
Go是一种强类型静态编译型语言,在定义变量和常量时需要显式地指出数据类型,但它也可以自己推倒,不过再定义新类型或函数时,必须显式地带上类型标识符。
内置函数(15个)
make new len cap append copy delete panic recover close complex real image print println
内置函数不需要用import引入,具有全局可见性,虽然都是小写字母,但是不影响全局可用性
常量值标识符(4个)
true false //true和false表示bool类型的两常量值:真和假
iota //用在连续的枚举类型的声明中
nil //指针/引用型的变量的默认值就是nil
Go的常量标识符代表的就是一个常量值,只不过这个常量值表达特殊的含义
空白标识符就不用说了
操作符就是符号集合,其中包含了运算符和显式的分隔符,大部分操作符即是分隔符也是一个token,这个在前面提到过
表示固定值的符号
使用一个名称来绑定一块内存地址,其中存放的数据类型由定义变量时指定的类型决定
基本类型变量声明有两种
显式的完整声明
var varName dataType [ = value]
var a int = 1
var a int = 2*3
var a int =b
短类型声明
varName := value
a, b := 1, "hello"
常量使用一个名称来绑定一块内存地址,其中存放的内容不可改变
预声明标识符用iota在常量声明中,一组多个常量同时声明时其值逐行增加,iota可以看作自增的枚举变量,专门用来初始化常量
基本数据类型包括布尔,整形,浮点,复数,字符串和rune类型
其中包括指针,数组,切片,map(字典)和struct
Go语言支持指针,生命类型为*T,Go同样支持多级指针**T。通过在变量名前家&来获取变量的地址。指针的特点如下。
1.在赋值语句中*T出现在“=”左边表示指针声明,*T在右边表示取指针指向的值,实例
var a = 11
p := &a //*p和a的值都是11
2.结构体指针访问结构体字段仍然使用“.”点操作符,Go语言没有“->”操作符。
3.Go不支持指针运算
4.函数中允许返回局部变量的地址。
a := [...]int(1, 2, 3)
a := [...]int(1:1, 2:3)
控制结构包含语句和标签与跳转,其中语句有if,switch,for
简单示例
if x <= y {
return y
} else {
return x
}
完整示例
if x := f(0); x < y {
return x
} else if x > z {
return z
} else {
return y
}
他会根据传入的参数检测并执行符合条件的分支。
Go只支持这一种循环语句
goto,break,continue