Go语言程序元素
标识符 identifier
预定义标识符
bool(true和false)bytefloat32、float64int、int8、int16、int32、int64unit、uint8、uint16、uint32、uint64、uintptrstring
appendcapclosecomplexcopydeleteimaglenmakenewpanicprintlnrealrecover
iotanil_
自定义标识符
用户自定义的程序实体,同一个代码块中不允许程序实体同名。
使用不同代码包中的实体需要使用包标识符声明,如fmt.Println表示的是使用fmt包中的Println标识符
关键字 keyword
- 包导入声明
importpackage - 程序实体声明与定义
vartypefunc``interfacemapstructchanconst - 流程控制
ifelseforcontinuebreakreturngocasegotoswitchselectdefaultdeferfallthroughrange
这些关键字也称保留字,不能用作常量、变量或任何其它标识符名称。除此之外,还有一个比较特殊的类型叫空接口,它的字面量是_
字面量 literal
字面量是表示值的一种标记法,但在Go语言中,字面量含义更广。首先,它用于表示基础数据类型的各种字面量;其次用于表示用户构造的自定义符合数据类型的类型字面量;最后它用于表示复合数据类型的值的复合字面量,简单来说,它会被用来构造类型Struct(结构体)、Array(数组)、Slice(切片)和Map(字典)的值。
const b int = 10 // b为常量,10为字面量var str string = "hello world" // str为变量,hello world为字面量
分隔符 delimiter
括号分隔符:括号、中括号、大括号
标点分隔符:小数点、逗号、分号、冒号、省略号
运算符 operator
| 运算符 | 说明 | ||
|---|---|---|---|
| 或 | |||
| && | 与 | ||
| ! | 非 | ||
| ==、!= | |||
| <、<= | |||
| >、>= | |||
| +、-、*、/ | 加减乘除。*同时也是一元地址运算符,表示取值操作 |
||
| 按位或 | |||
| ^ | 按位异或。也是一元运算运算符,表示按位取补码操作,例如 ^5 返回 -6 | ||
| % | 求余 | ||
| << | 按位左移 | ||
| >> | 按位右移 | ||
| & | 按位与。也是一元地址运算符,表示取址操作,如&str返回str所在的内存地址 |
||
| &^ | 按位清楚操作, |
Go语言中,一元运算符优先级高于二元运算符,二元运算符优先级如下
| 运算符 | 优先级 | ||
|---|---|---|---|
*``/``%``<<``>>``&``&^ |
最高 | ||
`+- |
`^ |
较高 | |
==``!=``<``<=``>``>= |
中 | ||
&& |
较低 | ||
| ` | ` | 最低 |
注释
// 注释/* 注释 *//*注释*/
Go语言基本概念
常量
// 常量使用关键字 const 定义,常量定义格式:const identifier[type] = value,如const Return = trueconst hello = "你好,Go语言"const 人数 = 100const Pi float32 = 3.1415926536const Pi = 3.1415926536\23846264338327950288\4197169399375105820974944\5923078164062// ↑省略类型说明符[type],Go语言编译器可智能判断值的类型;
3.14 // 十进制0213 // 八进制0x4b // 十六进制30u // 无符号整型,u大小写均可30l // long,l大小写均可078 // 非法032UU // 非法
换行符 \n制表符 \t
| \ | \’ | \” | \? | \b | \f | \n | \r | \t | \v |
|---|---|---|---|---|---|---|---|---|---|
| \字符 | ‘字符 | “字符 | ?字符 | 退格 | 换页 | 换行 | 回车 | 水平制表符 | 垂直制表符 |
a := 20c = ac += ac -= ac *= ac /= ac <<= ac >>= ac &= 2c ^= 2c |= 2
// 常量实现枚举const (Connected = 0Disconnected = 1Unknown = 2)// 使用 iota 关键字实现枚举const (a = iota // a==0b // b==1,隐式使用 iota 关键字,实际等同于 b=iotac // c==2,实际等同于 c=iotad, e, f = iota, iota, iota // d==3,e==3,f==3,同一行值相同,此处不能只写一个iotag = iota // g==4h = "h" // h=="h",单独赋值,iota递增为5i // i=="h",默认使用上边的赋值,iota递增为6j = iota // j==7)const z = iota // 每个单独定义的const常量中,iota都会重置,此时 z==0func main() {fmt.Println(a, b, c, d, e, f, g, h, i, j, z) // 0 1 2 3 3 3 4 h h 7 0}
变量
格式 var identifier type

package mainimport ("fmt""os")func main() {fmt.Println(a) // D:\Goa := "hello" // 局部变量定义,写在方法外会报错,一个变量在一个代码块只能被声明一次,但是函数体属于另一个代码块,所以可以重新声明该变量fmt.Println(a) // hello}var a = os.Getenv("GOPATH") // 全局变量定义,位置不限
func GetClass() (stuNum int, className, headTeacher string) {return 49, "一班", "二班"}func main() {stuNum, _, _ := GetClass() // 只想获取班级人数stuNum,其它不需要fmt.Println(stuNum) // 49}
int 0float 0.0bool falsestring ""指针 nil
// Go中,除了可以在全局声明中初始化实体,也可以在 init 函数中初始化。// init在包完成初始化后自动执行,执行优先级比 main 函数高,且不能手动调用 init 函数// 每个源文件有且只有一个init函数,初始化过程会根据包的依赖关系按顺序单线程执行package mainimport ("fmt""math")var Pi float64func init() {Pi = 4 * math.Atan(1)}func main() {DPi := Pi * Pifmt.Println(Pi, DPi) // 3.141592653589793 9.869604401089358}
