Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。
基础语法
标记
Golang程序是由换行符、注释、标识符和关键字等标记构成。
换行符
Golang允许没有;
,一行代码以换行结束,如果有;
也可以正常执行,但在ide里会在保存的时候被插件删除。
注释
Golang支持的注释有:
- 单行注释
// 单行注释
- 多行注释
/*
第一行注释
第二行注释
*/
标识符
标识符是程序中自定义的变量名、类名的一种标示,Golang合法标识符必须满足:
- 只能由
a~z
、A~Z
、0~9
和_
组成 - 第一个字符不能是数字
- 不能与Golang保留的关键字重名
合法的标识符:id idDelete n1 _foo
关键字
Golang中保留的关键字有:
关键字 | 作用 | 关键字 | 作用 | 关键字 | 作用 | 关键字 | 作用 | 关键字 | 作用 |
---|---|---|---|---|---|---|---|---|---|
break | 结束当前循环 | default | switch-case语块默认的case | func | 声明函数的关键字 | interface | 接口类型 | select | select-case语块 |
case | switch-case语块 | defer | 释放局部变量 | go | goroutine | map | 字典类型 | struct | 结构体关键字 |
chan | 通道类型 | else | if-else语块 | goto | 跳转到标记处 | package | switch | switch-case语块 | |
const | 常量的修饰符 | fallthrough | switch-case语块强制执行一个case | if | range | 迭代器 | type | 类型 | |
continue | 继续当前循环 | for | 循环 | import | 导入 | return | var | 声明变量 |
预定义标识符:
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
数据类型
基本类型
整型
类型 | 长度 | 范围 |
---|---|---|
int/uint | 32或64 | |
int8/byte | 8 | -128~127 |
int16 | 16 | -32768~32767 |
int32/rune | 32 | -2147483648~2147483647 |
int64 | 64 | -9223372036854775808~9223372036854775807 |
uint8 | 8 | 0~255 |
uint16 | 16 | 0~65535 |
uint32 | 32 | 0~4294967295 |
uint64 | 64 | 0~18446744073709551615 |
uintptr |
浮点型
类型 | 长度 | 范围 |
---|---|---|
float32 | 32 | IEEE-754 |
float64 | 64 | IEEE-754 |
complex64 | 32 | |
complex128 | 64 |
字符串
派生类型
指针
数组
结构体
Channel
函数
切片
接口
Map
变量
变量的声明
Golang的变量声明语法:
var foo int8
var abr int8 = 1
声明变量关键字是var
;int8
是指定变量的类型;foo
只声明,但是没有显示的赋值,此时foo
的只是默认值,基础类型的变量的默认值:
变量类型 | 默认值 |
---|---|
int、uint、float32…… | 0 |
string | (空字符串) |
bool | false |
Golang允许类型缺省,自动推断类型,所以必须赋初值:
var foo = 1
Golang支持的简写:
foo := 3
多变量声明
对于一组变量,Golang支持在一行里声明:
同类型的多个变量
var n1, n2, n3 int = 1, 2, 3
var n1, n2, n3 int
n1, n2, n3 = 1, 2, 3
var n1, n2, n3 = 1, 2, 3
简写
n1, n2, n3 := 1, 2, 3
这种自动推断机制可以用于声明一组不同类型的变量:
var id, username, isDelete = 1, "admin", false
id, username, isDelete := 1, "admin", false
常量
常量的声明
常量使用const
修饰,不能用:=
简写,自动推断同样适用。声明语法:
const abr int = 1
const id, username, isDelete = 1, "admin", false
常量在声明时必须赋值。常量的值允许是函数的返回值,但是必须是Golang内置的函数
var foo string = "hello"
const abr int = len(foo)
len()
是math
包的函数。
常量组的声明
const (
Success = 0
Failed = -1
)
常量组的声明中允许不写初始值(第一个除外),初始值会根据上一个常量来产生。
const (
x = 1
y = 2
z
)
x
、y
、z
的值一次是1
、2
、2
,z
的继续沿用了y
的值,不是沿用值而是沿用了等号右侧
const (
x = 1<<iota
y = 2<<iota
z
)
x
、y
、z
的值一次是1
、4
、8
,z
的值等于2<<iota
,第三行的iota
值为2
,2<<2
等于8
iota
iota
是一个特殊的变量,出现const
后,iota
的值被置为0
,每声明一个常量,iota
的值加一。
const (
n0 = iota //0
n1 //1
n2 //2
n3 = "Hello" //Hello
n4 //Hello
n5 = "World" //World
n6 = 100 //100
n7 //100
n8 = iota //8
n9 //9
)
iota
类似与常量组的下标。
运算符
算术运算符
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 整除 |
% | 取余 |
++ | 自加 |
- - | 自减 |
关系运算符
运算符 | 描述 |
---|---|
== | 等式判断 |
!= | 等式判断取非 |
> | 大于判断 |
< | 小于判断 |
>= | 大于等于判断 |
<= | 小于等于判断 |
逻辑运算符
运算符 | 描述 |
---|---|
|| | 或 |
&& | 且 |
! | 非 |
位运算符
运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
赋值运算符
运算符 | 描述 |
---|---|
= | 右侧的结果赋值给左侧 |
-= | 相减后赋值 |
*= | 相乘后赋值 |
/= | 相除后赋值 |
%= | 取余后赋值 |
<<= | 左移后赋值 |
>>= | 右移后赋值 |
&= | 按位与后赋值 |
|= | 按位或后赋值 |
^= | 按位异或后赋值 |
其他
运算符 | 描述 |
---|---|
&foo | 求foo的地址 |
*foo | 求foo的指针 |
运算符的优先级
[]
()
.
->
-
(type)
++
--
*
(指针)&
(地址)!
/
*
(乘)%
+
-
<<
>>
>
<
>=
<=
==
!=
&
^
|
&&
||
?:
=
*=
/=
%=
+=
-=
>>=
<<=
&=
^=
|=