Go语言的基本语法及案例知识点提取|青训营笔记

134 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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() 以字符串方式读出流