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)++--*(指针)&(地址)!/*(乘)%+-<<>>><>=<===!=&^|&&||?:=*=/=%=+=-=>>=<<=&=^=|=

被折叠的 条评论
为什么被折叠?



