1、Go程序源码结构
我们将一个Go程序的源码暂时称为一个项目 :
每个项目由若干个包组成;
每个包由同一个目录中的若干个go文件组成;
每个go文件中由若干函数、变量、常量等组成;
每个函数由流程控制语句、变量、常量、运算符和函数组成。
2、Go语言中的关键字
25个关键字:
break default func(定义函数) interface select
case defer go map struct
chan else goto package switch
const(定义常量) fallthrough if range type
continue for import return var(定义变量)
36个预定义标识符,其中包含了基本类型的名称和一些基本的内置函数:
(注:不用引入包就能使用的函数为内置函数)
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
print println real recover string true uint uint8 uintptr
程序中可能会使用到这些分隔符:
括号 (),中括号 [] 和大括号 {}。
程序中可能会使用到这些标点符号:
.、,、;、: 和 …。
程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
多个语句写在同一行,它们则必须使用 “;” 人为区分
3、常量
关键字const,格式:const identifier [type] = value
枚举常量
type Color int
const (
RED Color = iota // 0
ORANGE // 1
YELLOW // 2
)
iota遇到const变为0
4、变量
关键字var,格式:var identifier type(注意,类型在变量后面)如:var a int。
当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil。记住,所有的内存在 Go 中都是经过初始化的。
局部变量:使用简短声明语法 :=,如:a := 1
全局变量允许声明后不使用,局部变量声明后必须使用,否则会报错:a declared and not used
并行赋值:a, b, c := 5, 7, "abc"
交换变量值:a, b = b, a
空白标识符:_
init函数:它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。
每个源文件都只能包含一个 init 函数。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。
5、基本类型和运算
基本类型:
布尔类型 bool、 整型 int 、浮点型 float、复数complex64 、complex128
运算符:
位运算符:与&、或|、异或^、左移<<、右移>>、
逻辑运算符:==、!=、<、<=、>、>=
算术运算符:+、-、*、/、%、-=、*=、/=、%=、++、--;自增减只能用于后缀、
只能作为语句,而非表达式,如:f(i++)是无效
优先级 运算符
7 ^ !
6 * / % << >> & &^
5 + - | ^
4 == != < <= >= >
3 <-
2 &&
1 ||
类型别名:关键字type
字符类型:byte 类型是 uint8 的别名;Unicode字符rune是 int32 的别名
6、字符串
string类型:字符串是字节的定长数组,不可修改。
Go 支持以下 2 种形式的字面值:
解释字符串:该类字符串使用双引号括起来,其中的相关的转义字符将被替换,
这些转义字符包括:
\n:换行符
\r:回车符
\t:tab 键
\u 或 \U:Unicode 字符
\\:反斜杠自身
非解释字符串:
该类字符串使用反引号括起来,支持换行,例如:
`This is a raw string \n` 中的 `\n\` 会被原样输出。
字符串比较:
==、!=、<、<=、>=、>
字符串长度:
len(str)
字符串拼接:
+、+=
注意事项 获取字符串中某个字节的地址的行为是非法的,例如:&str[i]。
7、strings 和 strconv 包
前缀判断:strings.HasPrefix(s, prefix string) bool
后缀判断:strings.HasSuffix(s, suffix string) bool
字符串包含:strings.Contains(s, substr string) bool
子字符串在父字符串中的位置:strings.Index(s, str string) int
最后出现的位置:strings.LastIndex(s, str string) int
非ASCII编码的字符在父字符串中的位置:strings.IndexRune(s string, r rune) int
字符串替换:strings.Replace(str, old, new, n) string
将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new:
出现次数:strings.Count(s, str string) int
复制多次字符串:strings.Repeat(s, count int) string
转小写:strings.ToLower(s) string
转大写:strings.ToUpper(s) string
剔除字符串开头和结尾的空白符号:strings.TrimSpace(s) string
剔除字符串开头和结尾的指定字符:strings.Trim(s, “cut”) string
剔除字符串开头字符:strings.TrimLeft
剔除字符串结尾字符:strings.TrimRight
以空白符来分割字符串:strings.Fields(s),返回slice
以自定义分隔符来分割字符串:strings.Split(s, sep), 返回slice
将slice拼接成字符串:strings.Join(sl []string, sep string) string
strconv包:与字符串相关的类型转换
整数转字符串:strconv.Itoa(i int) string
浮点型转字符串:strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string 将 64 位浮点型的数字转换为字符串,其中 fmt 表示格式(其值可以是 ‘b’、‘e’、‘f’ 或 ‘g’),prec 表示精度,bitSize 则使用 32 表示 float32,用 64 表示 float64。
字符串转整数:strconv.Atoi(s string) (i int, err error)
字符串转浮点型:strconv.ParseFloat(s string, bitSize int) (f float64, err error)
8、日期和时间:time包
获取当前时间:time.Now()、t.Day()、t.Minute()
格式化输出时间:func (t Time) Format(layout string) string
休眠:time.Sleep(Duration d)
9、指针
取地址符是:&
地址内容引用:*