解析与格式化
解析和格式化是在处理数据时常见的操作。
数字解析
Go 语言提供了像 strconv
包这样的函数,用于将字符串解析为其他类型。
package main
import (
"fmt"
"strconv"
)
func main() {
// 将字符串解析为整数
numStr := "42"
num, err := strconv.Atoi(numStr)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Parsed Integer:", num)
// 将字符串解析为浮点数
floatStr := "3.14"
floatNum, err := strconv.ParseFloat(floatStr, 64)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Parsed Float:", floatNum)
// 使用基数将字符串解析为整数
hexStr := "1a"
num2, err := strconv.ParseInt(hexStr, 16, 64)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Parsed Hex Integer:", num2) // => 26
}
ParseInt
函数的签名是 func ParseInt(s string, base int, bitSize int) (i int64, err error)
。
如果 base
参数为0,则真实基数由字符串的前缀和符号(如果存在)推测得来:对于"0b",基数为2;对于"0"或"0o",基数为8;对于"0x",基数为16;否则为10。
bitSize
参数指定位大小, 0、8、16、32 和 64 对应于 int、int8、int16、int32 和 int64。
URL 解析
在 Go 语言中,通常使用 net/url
包进行 URL 解析。net/url
包提供了 URL 类型以及解析和操作 URL 的函数。
package main
import (
"fmt"
"net/url"
)
func main() {
// 示例URL
rawURL := "https://www.example.com:8080/path?query1=value1&query2=value2#fragment"
// 解析原始URL
parsedURL, err := url.Parse(rawURL)
if err != nil {
fmt.Println("Error parsing URL:", err)
return
}
// 访问解析URL的各个组件
fmt.Println("Scheme:", parsedURL.Scheme)
fmt.Println("Host:", parsedURL.Host)
fmt.Println("Port:", parsedURL.Port())
fmt.Println("Path:", parsedURL.Path)
fmt.Println("RawQuery:", parsedURL.RawQuery)
fmt.Println("Fragment:", parsedURL.Fragment)
// 解析查询参数
queryParams, err := url.ParseQuery(parsedURL.RawQuery)
if err != nil {
fmt.Println("Error parsing query parameters:", err)
return
}
// 访问各个查询参数
fmt.Println("Query Parameters:")
for key, values := range queryParams {
for _, value := range values {
fmt.Printf("%s: %s\n", key, value)
}
}
}
它的输出:
Scheme: https
Host: www.example.com:8080
Port: 8080
Path: /path
RawQuery: query1=value1&query2=value2
Fragment: fragment
Query Parameters:
query1: value1
query2: value2
时间解析 / 格式化
time
包提供了解析和格式化时间的功能。
Parsing
package main
import (
"fmt"
"time"
)
func main() {
// 解析日期字符串
dateStr := "2017-12-07"
parsedDate, err := time.Parse("2006-01-02", dateStr)
if err != nil {
fmt.Println("Error parsing date:", err)
return
}
fmt.Println("Parsed Date:", parsedDate)
// => Parsed Date: 2017-12-07 00:00:00 +0000 UTC
// 解析具有特定格式的时间字符串
timeStr := "15:04:05"
parsedTime, err := time.Parse(timeStr, "12:30:45")
if err != nil {
fmt.Println("Error parsing time:", err)
return
}
fmt.Println("Parsed Time:", parsedTime)
// => Parsed Time: 0000-01-01 12:30:45 +0000 UTC
}
格式化
package main
import (
"fmt"
"time"
)
func main() {
// 格式化当前时间
currentTime := time.Date(2017, time.October, 15, 13, 36, 28, 0, time.UTC)
formattedTime := currentTime.Format("Monday, January 2, 2006 15:04:05")
fmt.Println("Formatted Time:", formattedTime)
// => Formatted Time: Sunday, October 15, 2017 13:36:28
// 自定义格式化
customFormat := "02-Jan-2006 15:04:05"
customFormattedTime := currentTime.Format(customFormat)
fmt.Println("Custom Formatted Time:", customFormattedTime)
// => Custom Formatted Time: 15-Oct-2017 13:36:28
}
模板
文本模板
text/template
包用于基于文本的模板。
package main
import (
"bytes"
"fmt"
"text/template"
)
// 用于模板数据的User结构体
type User struct {
Name string
Email string
}
func main() {
// 定义一个简单的模板
const templateString = "Hello, {{.Name}}! Your email is {{.Email}}.\n"
// 创建一个新模板并解析模板字符串
tmpl, err := template.New("greeting").Parse(templateString)
if err != nil {
panic(err)
}
// 创建带有数据的User实例
user := User{
Name: "Lite Rank",
Email: "literank@example.com",
}
// 使用缓冲区来捕获模板输出
var resultBuffer bytes.Buffer
// 将模板应用于User实例,并将结果捕获在缓冲区中
err = tmpl.Execute(&resultBuffer, user)
if err != nil {
panic(err)
}
// 将缓冲区转换为字符串并打印结果
resultString := resultBuffer.String()
fmt.Println(resultString)
// => Hello, Lite Rank! Your email is literank@example.com.
}
HTML 模板
html/template
包用于基于 HTML 的模板。
package main
import (
"bytes"
"fmt"
"html/template"
)
// 用于模板数据的User结构体
type User struct {
Name string
Email string
}
func main() {
// 定义一个HTML模板
const templateHTML = `
<!DOCTYPE html>
<html>
<head>
<title>Greeting Page</title>
</head>
<body>
<h1>Hello, {{.Name}}!</h1>
<p>Your email is {{.Email}}.</p>
</body>
</html>`
// 创建一个新模板并解析HTML模板字符串
tmpl, err := template.New("greeting").Parse(templateHTML)
if err != nil {
panic(err)
}
user := User{
Name: "Lite Rank",
Email: "lr@example.com",
}
var resultBuffer bytes.Buffer
err = tmpl.Execute(&resultBuffer, user)
if err != nil {
panic(err)
}
fmt.Println(resultBuffer.String())
}
代码挑战
编写一个 Go 程序,读取 CSV(逗号分隔值)文件并执行以下任务:
- 将 CSV 数据解析为结构化数据格式(例如,结构体切片)。
- 以人类可读的格式打印解析的数据。
Loading...
> 此处输出代码运行结果