GO基础 | 青训营笔记

52 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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语句

image-20230214151012640.png

数组(长度固定)、切片(灵活,多用)

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分别为值,报错信息)

指针

支持的操作非常有限

(对传入的参数进行修改)

image-20230214163252737.png

结构体

带指针:可实现对结构图的修改,避免大结构图拷贝的开销

结构体方法

类似类成员函数 u user结构图名称,password string 传入参数

image-20230214163713632.png

错误处理

习惯的做法是使用一个单独的返回值来传递错误信息(不同于java异常)

能很清晰看到错误在哪个函数

nil是预定义的标识符,代表指针、通道、函数、接口、映射或切片的零值

函数实现

image-20230214164756657.png

两种错误处理

image-20230214164929177.png

字符串

image-20230214174859674.png

字符串格式化

image-20230214175026774.png

println换行输出

printf 格式化输出

%v 任意类型变量

%+v %#v 得到更详细结构(整个构造名称 字段名字 值)

JSON处理

image-20230214180126091.png

结构体struct字段名称第一个字母大写

json.Marshal序列化->半数组(字符串,要强转否则打印十六进制编码)

json.Unmarshal反序列到空变量b

序列化风格大写开头,要小写加上json:"age"

时间

image-20230214181343877.png

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()字符串/数字互转

image-20230214182526970.png

进程信息

os.Args获取进程的命令行参数,输出的命令行参数长度是五(临时目录 a b c d)

os.Getenv()获取

os.Setenv()写入环境变量

exec.Command().CombinedOutput()快速启动子进程,并输入输出

image-20230214183225739.png