什么是Go语言
-
高性能、高并发
-
语法简单、学习曲线平缓
-
丰富的标准库
自带很多标准库,不像其它语言一样全靠第三方库,不稳定
-
完善的工具链
编译 格式化 单元测试工具等
-
静态链接
默认全是静态链接,只有一个文件
-
快速编译
1s增量编译
-
跨平台
-
垃圾回收
无需考虑内存分配与释放
为什么选go
- 性能好
- 部署简单,学习成本低
- 内部框架的推广
安装
-
按官网提示安装
-
分享一下我的:mac下直接 `brew install go` 就完了
-
IDE
- vscode
- goland
基础语法
一个程序的基本结构
- 声明包
- 导入包
- man函数
运行
- go run 运行
- go build 编译
- 然后直接运行
变量
- 字符串是基本类型,可以直接通过相加来拼接
- 变量声明
var 名 = 值自动推导类型名:=值
常量
const 名 = 值- 常量没有特定类型,根据上下文推断
if else
- if 后面是没有括号的
循环
- 只有for
- 死循环,只有一个for 和循环体
- 经典循环,
for i :=0; i < 0; i++ {类型的- 没有括号
- 有continue
switch
-
无括号
-
默认只会执行当前case
- 避免c语言那样忘写break引起的bug
-
switch可以不写变量,放分支里当if
switch { case t.Hour() < 12: fmt.Println("It's before noon") default: fmt.Println("It's after noon") }
数组
- 长是固定的,一般不用一般用切片
切片
s := make([]string, 3)- 添加元素
s = append(s, "d")- 需要重新赋值
- 因为不定长可能会发生扩容,生成一个新对象
- 还支持像python一样的切片操作
- 但是不支持负数索引
map
- 哈希或字典
m := make(map[string]int)- 方括号中间是key的类型
- 后面是value的类型
- 写入
m["xxx"] = 1
- 读取
v, ok = ["xxx"]
- 删除
delete(m, "xxx")
range
- 遍历数组或map
- 数组每次遍历出来是 索引, 元素
- map每次遍历出来是 key, value
函数
- func 开头,返回值类型在最后
指针
- 像c语言,但是只支持少量操作
- 支持函数内修改
- 某些场景下可以避免大结构体拷贝的开销
结构体
type user struct{
name string
password string
}
- 全参初始化
- 全参指定参数名初始化
- 部分参数指定参数名初始化
- 通过
[xx.name](<http://xx.name>)来访问
结构体方法
-
类似类成员函数
func (u user) checkPassword(password string) bool{ return true }
错误处理
- 可能返回error类型的结果
- 使用
erros.New(”xxxx”)来创建异常
- 使用
字符串操作
- 标准库
strings包 strings.Contains(a,b)a包含bstrings.Count(a, b)a包含几个bstrings.HasPrefix(a,b)a以b为前缀strings.Index(a, b)b在a中的位置strings.Join(字符串数组)分隔拼接strings.Repeat(a, times)将重复拼接times次strings.Replace(a, b)替换strings.ToLower(a)转小写strings.ToUpper(a)转大写len(a)返回字符串长度
格式化字符串
fmt.Printlnfmt.Printf%v%+v详细打印v%#v更详细的打印v
%.2f- 保留两位小数打印
JSON处理
- 结构体中的首字母大小字段可以被自动处理
- 首字母大写的变量意味着是公开的
json.Marshal(a)- 序列化
err = json.Unmarshal(a, &b)- 反序列化给b
- 默认序列化完的变量首字母是大小
- 增加一个默认注释
Age intjson:"age"``
时间处理
time.Now()- 获取当前时间
time.Date(...)- 构造时间
diff := t2.Sub(t)- 返回t和t2之间的时间差
diff.Minutes()diff.Seconds()
t.Format("2006-01-02 15:04:05")- 格式化时间t
t, err := time.Parse("2006-01-02 15:04:05")- 解析时间
t.Unix()- 获取对应的时间戳
数字解析
strconv包strconv.ParseFloat("1.234", 64)- 64位的浮点数
strconv.ParseInt("111", 10, 64)- 64位的10进制整数
strconv.Atoi("123")- 快速把一个十进制字符串转成数字
strconv.Itoa(123)- 快速把一个数字转成字符串
进程信息
os.Args- 进程运行时的命令行参数
os.Getenv("PATH")- 获取环境变量的值
os.Setenv("AA", "bb")- 写环境变量
buf, err := exec.Command- 快速启动子进程