这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
1.本堂课重点内容
- Go的基本语法
- 部分标准库(日期时间处理,输出格式化,字符串处理)
2.详细知识点介绍
基本类型的声明
变量声明
var 变量名 = 值
var 变量名 变量类型 = 值
变量名 := 值
变量名 := 变量类型(值)
数组声明
var 数组名 [数组大小]数组类型
var 数组名 [数组大小]数组类型 = [数组大小]数组类型{值1,值2, ...}
变量名 := [数组大小]数组类型{值1,值2, ...}
切片声明(可变数组)
切片名 := make([]类型,切片大小)
字典声明
字典名 := make(map[键类型]值类型)
m := make(map[string]int)
r, ok := m["unknow"]
fmt.Println(r, ok)
// m中没有unknow键,因此ok返回false,可以判断键值对是否存在
函数声明
func 函数名(参数1 参数类型,参数2 参数类型, ...) 返回值 {}
func 函数名(参数1 参数类型,参数2 参数类型, ...) (返回值1 返回值类型,返回值2 返回值类型, ...) {}
变量1,变量2, ... = 函数(参数1,参数2, ...)
结构体声明
type 结构体名 struct {
变量名1 变量类型
变量名2 变量类型
...
}
变量名 := 结构体名{变量名1:值,变量名2:值, ...}
结构体方法声明(类似于OOP类方法)
func (变量名 结构体名) 函数名(参数1 参数类型,参数2 参数类型, ...) 返回值 {}
基本语法
错误处理
当代码块出错时,errors.New(“错误信息”) 方法将会返回 error 类型的值,里面包含错误信息
func findUser(...) (..., err error) {
...
return temp, errors.New("not found")
}
func main() {
user, err := findUser(...)
... err包含错误信息
}
主函数中的处理错误的变量(err)可以复用
JSON处理
对结构体进行Json处理,其内部变量名首字母必须大写
type userInfo struct {
Name string // √
name string // ×
...
}
func main() {
user := userInfo{Name: "Zhang", ...}
buf, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
...
fmt.Printf(buf) // 返回字节数组
fmt.Printf(string(buf)) // 返回字符串
}
json.Marshal()方法返回的是字节数组,不是字符串
标准库(部分)
time 日期时间处理
Now() 返回当前时间对象
Data(2022, 3, 27, 1, 25, 36, 0, time.UTC) 创建时间对象
Format("2006-01-02 15:04:05") 以类似的格式来格式化时间
Unix() 返回时间戳
官方文档 pkg.go.dev/time
strings 字符串处理
Contains() Count() HasPrefix() HasSuffix() Index() Join() Repeat() Replace() Split() ToLower() ToUpper() len() ...
在 len() 方法中汉字字符长度为 2
官方文档 pkg.go.dev/strings
3.实践联系例子
自动代码生成 - curl生成结构体 curlconverter.com/
自动代码生成 - JSON转Golang Struct oktools.net/json2go
利用上下文 context 实现并行
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go func() {
// ...
cancel()
}()
go func() {
// ...
cancel()
}()
<-ctx.Done() // 当cancel执行时Done()通道才会关闭,否则该代码将无休止运行
理解context技术 baijiahao.baidu.com/s?id=167408…
利用 bufio 实现带缓存的读取
官方文档 pkg.go.dev/bufio
Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer object, creating another object (Reader or Writer) that also implements the interface but provides buffering and some help for textual I/O.
包bufio实现了缓冲的I/O。它包装了一个io.Reader或io.Writer对象,创建了另一个对象(Reader或Writer),它也实现了该接口,但提供了缓冲和一些文本I/O的帮助。
reader := bufio.NewReader(os.Stdin) 创建一个流对象
input, err := reader.ReadString() 以字符串方式读出流