GO词法

GO程序

stringSort.go

  1. 第1行表示该程序在main包内,是一个可执行程序
  2. 3-6行导入了fmt包与sort包
  3. main函数用于对输入的英文排序
  4. 13行创建了一个名为sli的sring切片,相当于一个动态数组
  5. 14行创建了一个str的string变量用于获取输入的字符串
  6. for{}表示一个无限循环
  7. 在16行通过fmt.Scan(&str)将控制台输入的字符串赋值到str
  8. 当输入"EOF"时表示待排序的字符输完了
  9. append()是go的内置函数,用于slice的追加
  10. 调用sort包的Strings()即可将切片的字符串排序
  11. 通过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个关键字

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

  可将其分为三类:引导程序结构、声明复合数据结构、控制程序结构

引导程序结构

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 // 跳转语句 
  1. range可用于遍历slice、map,遍历slice时给出index、value,遍历map时给出key、value
  2. switch的每个case可有多个条件逗号间隔,不用写break,switch后可不带表达式,类似if else
  3. case后是一个表达式,可为常量、变量、一个有返回值的函数,但必须与switch表达式数据类型一致
  4. fallthrough是switch穿透,用于一个case匹配后不退出switch,默认穿透一层,执行下一层的语句
  5. type-switch,进行类型的判断执行

基本数据类型

go内置了七大类,20子类的数据类型

数值

数值分为整型、浮点型与复数型

整型

整型有12个,分为有符号与无符号,也根据位数进行划分

byteintint8int16int32int64
uintuint8uint16uint32uint64uintptr
  1. byte是uint8的别名,用于存放字母
  2. 整型默认为int
  3. 不同类型的整型必须强制转换
浮点型

浮点型有两个

float32float64
  1. 浮点型默认为float64
  2. 浮点型在机器中的存放形式为:浮点数=符号位+指数位+尾数位,尾数部分可能丢失,造成精度损失
复数型

复数型有两个

complex64complex128
  1. complex64由两个float32构成,分别为实部与虚部
  2. complex128由两个float64构成

字符与字符串

stringrune
  1. string由字节组成,utf-8编码,基本数据与string可通过fmt.Sprintf()或者strconv包内的函数进行转换
  2. rune是int32的别名,类似java中的char,golang使用unicode编码

接口型

error

布尔型

bool

  1. 一个字节,有true和false(默认)两个值
  2. 不能与整型数据互相转换

内置函数

go内置了15个函数,不需要import,内置函数全局可见

makenewlencapappend
copydeletepanicrecoverclose
complexrealimagprintprintln
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,添加了换行

常量标识符

有四个

truefalseiotanil
iota  // 是一个有意思的标识符,用于在连续的枚举类型的声明中
nil   // 指针/引用类型变量的默认值为nil,即java中的null

空白标识符

_ 即下划线,可用于声明一个匿名变量,用作占位或忽略函数返回的某个值

操作符

go一共定义了47种操作符,不但起到分隔token的作用,自身也是token

算术运算符(5)
+, -, *, /, %
位运算符(6)
&, |, ^, &^, >>, <<
赋值和赋值复核运算符(13)
:=, =, +=, -=, */=, /=, %=, &=, |=, ^=, &^=, >>=, <<=
比较运算符(6)
>, >=, <, <=, ==, !=
括号(6)
(),{},[]
逻辑运算符(3)
&&, || !
自增自减操作符(2)
++, --
其它运算符(6)
: , ; . ... <-
  1. :=用于变量的声明,只能出现在函数内,且声明变量必须含未出现过的
  2. …可用于数组的创建,或者切片copy时的分割
  3. <-用于chan的数据流动
  4. &可用于取地址
  5. *可用于获取该地址存的数据

分隔符

四种:空格、制表符、换行、回车

参考

《Go语言核心编程》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值