Go基础:了解Go中的排序,文本模板,正则表达式,JSON, XML

让我们深入探索高级主题,例如排序算法、模板和数据格式。

full lessons here👇:
https://programmerscareer.com/zh-cn/golang-basic-skill/

由AI生成,可能有错误,仅供参考

1.1 高级排序算法在 Golang 中

要成为 Go 排序的高手,我们需要熟悉 sort 包。sort 包提供了对切片或自定义集合的排序基本操作。

有多种方式可以对不同类型的数据进行排序,例如整数、浮点数和字符串。在下面是一个整数 slice 的排序示例:

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"fmt"
"sort"
)

func main() {
ints := []int{7, 2, 4, 8, 1}
sort.Ints(ints)
fmt.Println(ints)
}

当你运行程序时,你将看到整数排序在升序顺序。

然而,如果你想对复杂类型的集合进行排序或根据自定义顺序进行排序,你需要实现 sort.Interface 在你的数据上。该接口要求三个方法:Len(), Less()Swap()

这只是一个起始点,我们将深入探讨。

1.2 Golang 中的文本模板

Golang 有一个强大的 text/template 包,允许你创建文本模板来生成自定义输出格式。

假设我们有一个 Person 结构体:

1
2
3
4
type Person struct {
Name string
Age int
}

并创建了一个名为 Alice 的新人,她是 25 岁:

1
2
3
4
person := Person{
Name: "Alice",
Age: 25,
}

我们可以定义一个模板来输出个人信息。下面是一个简单的示例:

1
2
3
4
const tpl = `{{.Name}} is {{.Age}} years old.`
t := template.New("person")
t, _ = t.Parse(tpl)
t.Execute(os.Stdout, person)

当这个程序运行时,它将输出“Alice is 25 years old.”你也可以在模板中使用条件语句和循环,这使得它们非常强大用于生成复杂文本结构!

1.3 高级正则表达式技术

在 Golang 中,我们使用 regexp 包来处理正则表达式。让我们开始查看一些实际示例以获取深入的了解。

首先,让我们检查一个模式是否匹配字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"regexp"
)

func main() {
match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
fmt.Println(match) // prints: true

// 继续优化我们的工作,我们可以编译一个表达式并重复使用它使用 `Compile`:
r, _ := regexp.Compile("p([a-z]+)ch")
fmt.Println(r.MatchString("peach")) // prints: true
}

我们也可以将字符串中的子集替换为其他值:

1
fmt.Println(r.ReplaceAllString("a peach", "<fruit>")) // prints: a <fruit>

1.4 在 Golang 中使用 JSON

JSON(JavaScript 对象表示法)可能是互联网上最常见的数据交换格式。Go 的 encoding/json 包提供了对 JSON 数据的功能。

让我们从一个简单示例开始,marshalling 一个 map 到 JSON 数据中。marshalling 是将内存表示转换为可用于存储或传输的数据格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"encoding/json"
"fmt"
)

func main() {
colors := map[string]string{
"red": "#ff0000",
"green": "#00ff00",
"blue": "#0000ff",
}
bytes, err := json.Marshal(colors)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(bytes))
}

当你运行程序时,你将获得一个 JSON 表示形式的 colors map。

现在,让我们反向 marshalling 到 JSON:

1
2
3
4
5
6
var colors map[string]string
err := json.Unmarshal(bytes, &colors)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Red color code: %s\n", colors["red"])

当程序运行时,它将打印红色颜色的代码,这是“#ff0000”。

主题:1.5 使用 Golang 中的 XML

与 JSON 一样,XML(eXtensible Markup Language)是另一种常见的数据交换格式。可以将其视为 HTML 的更正式、更加严格版本。

正如 JSON 一样,Go 有标准库支持 XML,通过 encoding/xml 包。

让我们直接进入示例。假设我们有一个 cafe 菜单的 XML 数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<menu>  
<meal>
<name>Breakfast</name>
<dish>
<name>Pancakes</name>
<price>4.5</price>
</dish>
</meal>
<meal>
<name>Lunch</name>
<dish>
<name>Burger</name>
<price>6</price>
</dish>
</meal>
</menu>

首先,我们需要定义这个 XML 的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Dish struct {  
Name string `xml:"name"`
Price float64 `xml:"price"`
}

type Meal struct {
Name string `xml:"name"`
Dish Dish `xml:"dish"`
}

type Menu struct {
XMLName xml.Name `xml:"menu"`
Meal []Meal `xml:"meal"`
}

然后,我们可以解析这个 XML:

1
2
var menu Menu   
xml.Unmarshal(xmlData, &menu)

假设我们有以下 Menu 对象:

1
2
3
4
5
6
menu := Menu{  
Meal: []Meal{
{"Breakfast", Dish{"Pancakes", 4.5}},
{"Lunch", Dish{"Burger", 6.0}},
},
}

并且,我们想生成一个 XML 表示形式的 Menu 对象。我们可以使用 xml.Marshal() 函数。它与 json.Marshal() 函数非常相似:

1
2
3
4
5
6
xmlData, err := xml.Marshal(menu)   
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(xmlData))

需要注意的是,xml.Marshal() 函数默认不包括头。如果你想包含 <?xml version="1.0" encoding="UTF-8"?> 头,你应该使用 xml.MarshalIndent() 函数:

1
2
3
4
5
6
xmlData, err := xml.MarshalIndent(menu, "", "  ")   
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(xmlData))

主题:1.6 回顾和评估

回顾

让我们回顾一下我们所涵盖的内容:

  1. 高级排序算法在 Golang 中:我们探索了 Golang 实现排序算法的方式,并讨论了它们的使用。
  2. 文本模板在 Golang 中:我们学习了文本模板的概念,并了解如何输出自定义文本。
  3. 高级正则表达式技术:我们深入探索了正则表达式在 Golang 中的实际应用。
  4. 使用 JSON 在 Golang 中:我们使用 Golang 的 JSON 库,解析、生成和操作 JSON 数据。
  5. 使用 XML 在 Golang 中:我们设计、解析和实现 XML 数据,类似于对 JSON 数据的处理。
  6. 实际应用场景:我们讨论了这些高级 Golang 概念的实际应用场景。

评估

  1. 排序结构评估:给定一个名为 Songs 的结构,它有字段 TitleArtistDuration,编写一个 Go 程序,用于对这些歌曲的标题进行排序,然后根据其持续时间进行排序。
  2. 模板评估:编写一个 Go 程序,使用文本模板创建个性化的问候语。
  3. 正则表达式评估:编写一个 Go 程序,使用正则表达式验证字符串是否是有效的电话号码。
  4. JSON 评估:编写一个 Go 程序,输入一个 JSON 字符串,表示用户的属性 NameEmailAge,并将其解析到 User 结构中。
  5. XML 评估:编写一个 Go 程序,创建一个名为 Employee 的结构,填充一些数据,然后将其 marshal 到 XML 中。

English post: https://programmerscareer.com/go-basic-11/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

Go基础:了解 HTTP Client, HTTP Server, Context, Processes, Signals, Exit in Go Go基础:理解 Reading Files, Writing Files, Line Filters in Go

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×