这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
01 认识
go语言特点:
高性能、高并发(只需引入标准库或基于标准库的第三方库),语法简单(类似c),丰富的标准库(标准函数库,大概率不需要借助第三方库,稳定性和兼容性保障,享受语言迭代带来的性能优化),完善的工具链(内置完整的单元测试框架 数值竞争检测?),静态链接(所有的编译结构默认,拷贝之后唯一一个可执行文件,不需加任何就可部署运行,体积小-对比java的jre),快速编译,跨平台(交叉编译特性),垃圾回收(无需关注内存分配释放)
例1:http服务器(可以承载静态文件访问的支持高并发高性能的服务器)
http.Handle("/", http.FileServer(http.Dir(".")))
// 在标准库的http包里 “/”路由指向静态文件
http.ListenAndServer(":8080", nill)
// 增添8080端口,启动服务器
公司应用:go的rpc框架Kitex、http框架Hertz
主要在云计算、微服务,Docker、Kubernetes、lstio、etcd、prometheus,几乎所有的云原生组件都是Go实现。
02 入门
go为强类型语言
基础语法
变量var、常量const(没有确定类型)
var a = "initial"
var b,c int = 1,2
f := float32(e)
const s string = "constant"
switch(与c++不同) :第一个case跑完直接退出switch,不会跑其他分支,分支内默认不写break。switch内可使用任意数据类型(字符串、结构体),甚至取代if-else语句
数组(长度固定)、切片(灵活,多用)
slice存储长度、容量、指向数组的指针,容量不够会扩容成一个新的切片 s = append(s, "d","e") // 注意第一个s,要加回去,否则另开辟新空间存放时 s的容量没更新
切片操作不支持负数索引 fmt.Println(s[2:5])
map哈希/字典
r, ok := m["unknown"] // ok获取key存在
map是无序的
range
快速遍历map或slice
函数
可返回多个值(v,ok分别为值,报错信息)
指针
支持的操作非常有限
(对传入的参数进行修改)
结构体
带指针:可实现对结构图的修改,避免大结构图拷贝的开销
结构体方法
类似类成员函数 u user结构图名称,password string 传入参数
错误处理
习惯的做法是使用一个单独的返回值来传递错误信息(不同于java异常)
能很清晰看到错误在哪个函数
nil是预定义的标识符,代表指针、通道、函数、接口、映射或切片的零值
函数实现
两种错误处理
字符串
字符串格式化
println换行输出
printf 格式化输出
%v 任意类型变量
%+v %#v 得到更详细结构(整个构造名称 字段名字 值)
JSON处理
结构体struct字段名称第一个字母大写
json.Marshal序列化->半数组(字符串,要强转否则打印十六进制编码)
json.Unmarshal反序列到空变量b
序列化风格大写开头,要小写加上json:"age"
时间
t.format()格式化,注意是用具体时间
t2.sub()获取时间段
st := "2019-11-21 11:59:01" t, _ := time.Parse("2006-01-02 15:04:05", st)获取UTC时间 t, _ := time.ParseInLocation("2006-01-02 15:04:05", st, LOC)获取LOC(当地东八区)时间
now.Unix获取时间戳
数字解析
在"strconv"包里(string converse)
ParseInt(字符串,进制,精度) 进制0则自动值推测
Atoi()字符串/数字互转
进程信息
os.Args获取进程的命令行参数,输出的命令行参数长度是五(临时目录 a b c d)
os.Getenv()获取
os.Setenv()写入环境变量
exec.Command().CombinedOutput()快速启动子进程,并输入输出