» Go语言快速入门 » 1. 基础篇 » 1.10 解析与格式化

解析与格式化

解析和格式化是在处理数据时常见的操作。

数字解析

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(逗号分隔值)文件并执行以下任务:

  1. 将 CSV 数据解析为结构化数据格式(例如,结构体切片)。
  2. 以人类可读的格式打印解析的数据。
Loading...
> 此处输出代码运行结果
上页
下页