上一篇:Go:简介和特点
下一篇:Go:基础知识(二)
概述
本文将介绍Go语言的一些基础知识,目的是想针对初学者,能对Go的基础词法和语法有个简单的认识,具体使用会在后面结合代码详细介绍。
一、Go标识符
标识符是用来标识编程语言语法对象的符号,假如编程就像是在玩乐高积木,标识符就是一块块基础积木形状,玩家除了可以使用厂家提供的基础积木块,也可以将N个积木块组合成基础形状自定义。换句话说,标识符一般分为两种,一种是程序设计者预声明的标识符,一种是程序开发者自定义的标识符,通常自定义的标识不能与预声明的标识符一样,否则编译不能通过。
Go语言预声明的标识符包含:
- 关键字(25个)
- 内置数值类型标识符(20个)
- 内置常量标识符(4个)
- 内置函数标识符(15个)
- 空白标识符(1个)
下面简单的聊聊这些预声明的标识符。
1.1 关键字
上篇谈到Go一直在追求极简的风格,Python保留的关键字大约30多个,而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
这里挑几个Go特色的关键字简单聊聊,不清楚的没关系,后面还会具体聊聊用法,这里给初学者总体感受一下Go的代码风格。
interface
在Go中,接口是一组方法签名(声明的是一组方法的集合)。当一个类型为接口中的所有方法提供定义时,它被称为实现该接口。
基本用法:
// interface基本用法
type Person interface { // 定义一个Person接口
Talk() string
Think() string
}
func Test(var interface{}){
// 定义一个Test函数,入参为interface{}类型
}
这里我们定义了一个Person的接口,包含两种方法,Talk()和Think(),这就是整个Go语言核心的部分之一,对比面向对象或者面向类的编程抽象设计,Go不需要具体的数据类型或者元素去进行抽象设计,而是通过一组方法抽象,Person是包含Talk()和Think()的方法的接口,也就是只要包含了Talk()和Think()方法的对象都可以是Person接口,这就是”Duck模型“,在Go里面,只要有翅膀,会叫的东西都可以叫鸭子,后面我们会具体聊聊Go的interface。
select
select就是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。
基本用法:
// select基本用法
select {
case <- chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1:
// 如果成功向chan2写入数据,则进行该case处理语句
default:
// 如果上面都没有成功,则进入default处理流程
defer
defer是Go预声明的标识符,Python里面也有defer,但需要导入defer库,两者作用相似。Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行,Go的defer一般用于释放某些已分配的资源。
基本用法:
// defer基本用法
func Read(idx int) string {
mutex.Lock() // 读数据前先互斥锁锁住
defer mutex.Unlock() // 锁住后立马用defer标记互斥锁释放语句,defer语句会在程序结束时执行,这样避免了开发者忘记添加释放语句
return value[idx]
}
var
var一般用于变量的声明,Go的变量声明一般有两种方式:
// var基本用法
// var用于显示的完整声明
var a int
var b int = 1
// 另一种短类型声明,不需要指定变量c的类型,编译器会自动进行数据类型推断
c := 2
1.2 内置数值类型标识符
Go语言是一门强类型的静态编译语言,在定义常量或者变量的时候需要显示的定义出数据类型,当然Go也支持自动类型推断,如上变量c的命名方式。Go语言总共保留了20个内置数值类型标识符:
// 整型 12个
byte int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
// 浮点型 2个
float32 float64
// 复数型 2个
complex64 complex128
// 字符串和字符 2个
string rune
// bool型 1个
bool
// 接口型 1个
error
1.3 内置常量标识符
true false // bool型两个常量
iota // 连续枚举值声明
nil // 空指针/引用类型
iota
Go的iota是一个比较奇怪的存在,它只能用在const的申明中,是一个从0开始的行数索引器,默认递增。
// iota基本用法
const(
a = iota // a = 0
b // b = 1
c // c = 2
d // d = 3
)
const(
a = iota*2 // a = 0*2
b // b = 1*2
c // c = 2*2
d // d = 3*2
)
1.4 内置函数标识符
// 内置函数标识符 15个,不需要import导入,全局可见性
make new len cap append copy delete panic
recover close complex real image print println
1.5 空白标识符
// 空白标识符
// 定义一个GetValue方法,返回一个整型和error
func GetValue() (int,error) {
return 1, nil
}
func main() {
// 调用GetValue()方法
// 但暂时用不到error返回值,可以用"_"空白标识符代替
a, _ := GetValue()
}
Go的空白标识符"_"也是个很有意思的存在,由于Go不允许存在没有使用的包和变量,对于那些不想使用的变量可以用空白标识符代替。
上一篇:Go:简介和特点
下一篇:Go:基础知识(二)