GO程序
stringSort.go
- 第1行表示该程序在main包内,是一个可执行程序
- 3-6行导入了fmt包与sort包
- main函数用于对输入的英文排序
- 13行创建了一个名为sli的sring切片,相当于一个动态数组
- 14行创建了一个str的string变量用于获取输入的字符串
- for{}表示一个无限循环
- 在16行通过fmt.Scan(&str)将控制台输入的字符串赋值到str
- 当输入"EOF"时表示待排序的字符输完了
- append()是go的内置函数,用于slice的追加
- 调用sort包的Strings()即可将切片的字符串排序
- 通过for range将sli内的字符串挨个获取
package main
import (
"fmt"
"sort"
)
/**
1. @Description:
2. 输入英文,得到排序结果
*/
func main() {
sli := make([]string,6)
var str string
for{
fmt.Scan(&str)
if str == "EOF" {
break
}
sli = append(sli,str)
}
sort.Strings(sli)
for _,val := range sli {
fmt.Println(val)
}
}
以上为一个简单的go程序,后面将介绍go语言的词法
词法
《Go语言核心编程》一书说token是构成源程序的基本不可再分割的单元,源程序的编译过程就是将其分割为一个个独立的token,所以需要对go语言中的token进行了解。
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 |
可将其分为三类:引导程序结构、声明复合数据结构、控制程序结构
引导程序结构
package // 定义包名的关键字
import // 导入包名关键字
const // 常量声明关键字,类似于java的final
var // 变量声明关键字
func // 函数定义关键字
defer // 延迟执行关键字,类似java中的finally
go // 并发语法糖关键字
return // 函数返回关键字
defer以栈的形式执行,若有使用变量,会把该语句之前的变量值进行拷贝,之后变量的变换不会影响defer语句中的变量值
声明复合数据结构
struct // 定义结构类型关键字
interface // 定义接口类型关键字
map // 声明或创建map类型关键字
chan // 声明或创建通道类型关键字
控制程序结构
if else
for range break continue
switch select type case default fallthrough
goto // 跳转语句
- range可用于遍历slice、map,遍历slice时给出index、value,遍历map时给出key、value
- switch的每个case可有多个条件逗号间隔,不用写break,switch后可不带表达式,类似if else
- case后是一个表达式,可为常量、变量、一个有返回值的函数,但必须与switch表达式数据类型一致
- fallthrough是switch穿透,用于一个case匹配后不退出switch,默认穿透一层,执行下一层的语句
- type-switch,进行类型的判断执行
基本数据类型
go内置了七大类,20子类的数据类型
数值
数值分为整型、浮点型与复数型
整型
整型有12个,分为有符号与无符号,也根据位数进行划分
byte | int | int8 | int16 | int32 | int64 |
---|---|---|---|---|---|
uint | uint8 | uint16 | uint32 | uint64 | uintptr |
- byte是uint8的别名,用于存放字母
- 整型默认为int
- 不同类型的整型必须强制转换
浮点型
浮点型有两个
float32 | float64 |
---|
- 浮点型默认为float64
- 浮点型在机器中的存放形式为:浮点数=符号位+指数位+尾数位,尾数部分可能丢失,造成精度损失
复数型
复数型有两个
complex64 | complex128 |
---|
- complex64由两个float32构成,分别为实部与虚部
- complex128由两个float64构成
字符与字符串
string | rune |
---|
- string由字节组成,utf-8编码,基本数据与string可通过fmt.Sprintf()或者strconv包内的函数进行转换
- rune是int32的别名,类似java中的char,golang使用unicode编码
接口型
error
布尔型
bool
- 一个字节,有true和false(默认)两个值
- 不能与整型数据互相转换
内置函数
go内置了15个函数,不需要import,内置函数全局可见
make | new | len | cap | append |
---|---|---|---|---|
copy | delete | panic | recover | close |
complex | real | imag | println |
make // 分配引用类型的内存:map、slice、chan。eg:var varName []type = make([]type,len,cap)
new // 分配值类型的内存,如int、float32,struct等,返回指针
len // 获取变量长度
cap // 获取变量容量
append // 对slice追加数据,可追加切片,append(slice,100,200,300),append(slice1,slice2...)
copy // 对切片进行拷贝,copy(slice,slice1),将slice1拷贝到slice,若slice容量不够,仅拷贝前几个,不报错
delete // 删除map的键值对,delete(mapName,key),若有key则删,无也不报错
panic // 手动触发宕机
recover // 宕机恢复,防止程序崩溃,捕获panic的输入值,使进入宕机的goroutine恢复,仅在defer中有效
close // 用于关闭chan,close(chanName)
complex // 定义复数变量, var varName complex128 = complex(x,y),x为实部,y为虚部
real // 用于获取复数的实部
imag // 用于获取复数的虚部
print // 输出到标准错误流中并打印,不建议使用,建议使用fmt包
println // 同print,添加了换行
常量标识符
有四个
true | false | iota | nil |
---|
iota // 是一个有意思的标识符,用于在连续的枚举类型的声明中
nil // 指针/引用类型变量的默认值为nil,即java中的null
空白标识符
_ 即下划线,可用于声明一个匿名变量,用作占位或忽略函数返回的某个值
操作符
go一共定义了47种操作符,不但起到分隔token的作用,自身也是token
算术运算符(5)
+, -, *, /, %
位运算符(6)
&, |, ^, &^, >>, <<
赋值和赋值复核运算符(13)
:=, =, +=, -=, */=, /=, %=, &=, |=, ^=, &^=, >>=, <<=
比较运算符(6)
>, >=, <, <=, ==, !=
括号(6)
(),{},[]
逻辑运算符(3)
&&, || !
自增自减操作符(2)
++, --
其它运算符(6)
: , ; . ... <-
- :=用于变量的声明,只能出现在函数内,且声明变量必须含未出现过的
- …可用于数组的创建,或者切片copy时的分割
- <-用于chan的数据流动
- &可用于取地址
- *可用于获取该地址存的数据
分隔符
四种:空格、制表符、换行、回车
参考
《Go语言核心编程》