Go 语言可以用于写纯过程式程序,用于写面向对象程序,也可以用于写过程式和面向对象相结合的程序
语句基础
- Go 语言需要使用分号
;
来作为上下文语句的分隔结束符,然而实际的程序中,很少使用分号,那是因为程序编译器自动帮我们处理了 - 有两个地方必须使用分号:
- 在一行中放入一条或者多条语句时
- 使用原始的
for
循环
- 自动插入分号的一个重要结果是,右大括号无法自成一行
-
内置函数:
内置函数 - gofmt 程序能够将 Go 代码标准格式化
- 如果一个变量已经存在,它就会直接被赋值,而不会新建一个变量,除非
:=
操作符位于作用域的起始处,如if
或for
语句的初始化语句
类型转换
Go 语言提供一种在不同当相互兼容的类型之间相互转换的方式,这种方式非常有用并且安全
- 非数值类型之间转换不会丢失精度
- 对于数值类型之间的转换,可能会丢失精度或者其他问题
类型转换的语法:
resultOfType := Type(expression)
- 如果目标类型比源类型小,则可能丢失精度
类型断言
- 一种类型的方法集是一个可以被该类型的值调用的所有方法的合集
- Go 语言中的
interface{}
类型用于表示空接口,即一个方法集为空集的类型的值 - 我们可以使用类型开关、类型断言、或者 Go 语言的
reflect
包类型检查将一个interface{}
类型的值转换成实际数据的值 - 类型断言:
resultOfType, boolean := expression.(Type) // 安全类型断言
resultOfType := expression.(Type) // 非安全类型断言,失败时 panic()
分支
Go 语言提供 3 种分支语句,即 if
、switch
和 select
,分支也可以通过一个映射来达到,它的键用于选择分支,值则是对应的函数
if 语句
-
if
语句可能包含零到多个else if
子句 - 语句中大括号是强制性
- 布尔表达式必须是
bool
类型,Go 语言不会自动转换非布尔值,因此必须用比较操作符
switch 语句
- Go 语言有两种
switch
语句:表达式开关 和 类型开关 - Go 语言的
switch
语句不会自动地向下贯穿,因此不需要在每一个case
子句末尾添加一个break
语句 - 在调用是需要通过显式地调用
fallthrough
语句
表达式开关
- 表达式开关语法:
switch optionalStatement; optionalExpression {
case expressionList1: block1
...
case expressionListN: blickN
default: blockD
}
- 如果有可算的声明语句,那么其中的分号是必要的
- 如果
switch
语句未包括可选的表达式语句,那么编译器会假设其表达式为 true -
case
语句排序最有效的方法是,从头到尾按最有可能到最没可能的顺序列出来 - 原始用法:
switch suffix := Suffix(file); suffix { ∥ 原始的非经典用法
case ".gz":
return GzipFileList(file)
case ".tar":
fallthrough
case ".tar.gz":
fallthrough
case ".tgz":
return TarFileList(file)
case ".zip":
return ZipFileList(file)
}
- 经典用法:
switch Suffix(file) { // 经典用法
case ".gz":
return GzipFileList(file)
case ".tar", ".tar.gz", ".tgz":
return TarFileList(file)
case ".zip":
return ZipFileList(file)
}
- 很多情况下可以用于代替
if
语句,并且更加紧凑
类型开关
- 类型开关语法:
switch optionalStatement; typeSwitchGuard {
case typeList1: block1
...
case typeListN: blickN
default: blockD
}
- 类型开关守护(
guard
)是一个结果为类型的表达式 - Go 语言可以通过鸭子类型支持多态
- 使用的类型开关守护与类型断言里的格式一样,即
variable.(Type)
,但是使用type关键字而非一个实际类型,以用于表示任意类型
网友评论