Go语言程序元素

标识符 identifier

预定义标识符
  1. bool(truefalse)
  2. byte
  3. float32float64
  4. intint8int16int32int64
  5. unituint8uint16uint32uint64uintptr
  6. string
  1. append
  2. cap
  3. close
  4. complex
  5. copy
  6. delete
  7. imag
  8. len
  9. make
  10. new
  11. panic
  12. print
  13. println
  14. real
  15. recover
  1. iota
  2. nil
  3. _
自定义标识符

用户自定义的程序实体,同一个代码块中不允许程序实体同名。

使用不同代码包中的实体需要使用包标识符声明,如fmt.Println表示的是使用fmt包中的Println标识符

关键字 keyword

  • 包导入声明 import package
  • 程序实体声明与定义 var type func``interface map struct chan const
  • 流程控制 if else for continue break return go case goto switch select default defer fallthrough range

这些关键字也称保留字,不能用作常量、变量或任何其它标识符名称。除此之外,还有一个比较特殊的类型叫空接口,它的字面量是_

字面量 literal

字面量是表示值的一种标记法,但在Go语言中,字面量含义更广。首先,它用于表示基础数据类型的各种字面量;其次用于表示用户构造的自定义符合数据类型的类型字面量;最后它用于表示复合数据类型的值的复合字面量,简单来说,它会被用来构造类型Struct(结构体)、Array(数组)、Slice(切片)和Map(字典)的值。

  1. const b int = 10 // b为常量,10为字面量
  2. var str string = "hello world" // str为变量,hello world为字面量

分隔符 delimiter

括号分隔符:括号、中括号、大括号

标点分隔符:小数点、逗号、分号、冒号、省略号

运算符 operator

运算符 说明
&&
!
==、!=
<、<=
>、>=
+、-、*、/ 加减乘除。*同时也是一元地址运算符,表示取值操作
按位或
^ 按位异或。也是一元运算运算符,表示按位取补码操作,例如 ^5 返回 -6
% 求余
<< 按位左移
>> 按位右移
& 按位与。也是一元地址运算符,表示取址操作,如&str返回str所在的内存地址
&^ 按位清楚操作,

Go语言中,一元运算符优先级高于二元运算符,二元运算符优先级如下

运算符 优先级
*``/``%``<<``>>``&``&^ 最高
`+- `^ 较高
==``!=``<``<=``>``>=
&& 较低
` ` 最低

注释

  1. // 注释
  2. /* 注释 */
  3. /*
  4. 注释
  5. */

Go语言基本概念

常量

  1. // 常量使用关键字 const 定义,常量定义格式:const identifier[type] = value,如
  2. const Return = true
  3. const hello = "你好,Go语言"
  4. const 人数 = 100
  5. const Pi float32 = 3.1415926536
  6. const Pi = 3.1415926536\
  7. 23846264338327950288\
  8. 4197169399375105820974944\
  9. 5923078164062
  10. // ↑省略类型说明符[type],Go语言编译器可智能判断值的类型;
  1. 3.14 // 十进制
  2. 0213 // 八进制
  3. 0x4b // 十六进制
  4. 30u // 无符号整型,u大小写均可
  5. 30l // long,l大小写均可
  6. 078 // 非法
  7. 032UU // 非法
  1. 换行符 \n
  2. 制表符 \t
\ \’ \” \? \b \f \n \r \t \v
\字符 ‘字符 “字符 ?字符 退格 换页 换行 回车 水平制表符 垂直制表符
  1. a := 20
  2. c = a
  3. c += a
  4. c -= a
  5. c *= a
  6. c /= a
  7. c <<= a
  8. c >>= a
  9. c &= 2
  10. c ^= 2
  11. c |= 2
  1. // 常量实现枚举
  2. const (
  3. Connected = 0
  4. Disconnected = 1
  5. Unknown = 2
  6. )
  7. // 使用 iota 关键字实现枚举
  8. const (
  9. a = iota // a==0
  10. b // b==1,隐式使用 iota 关键字,实际等同于 b=iota
  11. c // c==2,实际等同于 c=iota
  12. d, e, f = iota, iota, iota // d==3,e==3,f==3,同一行值相同,此处不能只写一个iota
  13. g = iota // g==4
  14. h = "h" // h=="h",单独赋值,iota递增为5
  15. i // i=="h",默认使用上边的赋值,iota递增为6
  16. j = iota // j==7
  17. )
  18. const z = iota // 每个单独定义的const常量中,iota都会重置,此时 z==0
  19. func main() {
  20. fmt.Println(a, b, c, d, e, f, g, h, i, j, z) // 0 1 2 3 3 3 4 h h 7 0
  21. }

变量

格式 var identifier type

第2章 程序结构 - 图1

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