导航菜单

Go 语言数据处理实践

JSON 处理

基本操作

在 Go 中处理 JSON 数据:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    // 编码 JSON
    person := Person{Name: "张三", Age: 25}
    jsonData, err := json.Marshal(person)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(jsonData))

    // 解码 JSON
    var decodedPerson Person
    err = json.Unmarshal(jsonData, &decodedPerson)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", decodedPerson)
}

CSV 处理

读写 CSV

使用标准库处理 CSV 文件:

package main

import (
    "encoding/csv"
    "os"
)

func main() {
    // 写入 CSV
    file, err := os.Create("data.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    data := [][]string{
        {"姓名", "年龄", "城市"},
        {"张三", "25", "北京"},
        {"李四", "30", "上海"},
    }

    for _, row := range data {
        err := writer.Write(row)
        if err != nil {
            panic(err)
        }
    }

    // 读取 CSV
    file, err = os.Open("data.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }

    for _, record := range records {
        // 处理每一行数据
        fmt.Println(record)
    }
}

XML 处理

XML 编解码

处理 XML 数据:

package main

import (
    "encoding/xml"
    "fmt"
)

type Book struct {
    XMLName xml.Name `xml:"book"`
    Title   string   `xml:"title"`
    Author  string   `xml:"author"`
    Year    int      `xml:"year"`
}

func main() {
    book := Book{Title: "Go 编程", Author: "张三", Year: 2023}
    
    // 编码 XML
    xmlData, err := xml.MarshalIndent(book, "", "    ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(xmlData))

    // 解码 XML
    var decodedBook Book
    err = xml.Unmarshal(xmlData, &decodedBook)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", decodedBook)
}

大数据处理

流式处理

处理大型文件时使用流式处理:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("large_file.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        // 逐行处理数据
        line := scanner.Text()
        processLine(line)
    }

    if err := scanner.Err(); err != nil {
        panic(err)
    }
}

func processLine(line string) {
    // 处理单行数据
    fmt.Println("Processing:", line)
}

数据验证

使用 validator

使用 validator 包进行数据验证:

package main

import (
    "fmt"
    "github.com/go-playground/validator/v10"
)

type User struct {
    Username string `validate:"required,min=4,max=20"`
    Email    string `validate:"required,email"`
    Age      int    `validate:"gte=0,lte=130"`
}

func main() {
    validate := validator.New()

    user := User{
        Username: "zh",
        Email: "invalid-email",
        Age: 150,
    }

    err := validate.Struct(user)
    if err != nil {
        validationErrors := err.(validator.ValidationErrors)
        for _, e := range validationErrors {
            fmt.Println("字段:", e.Field(), "错误:", e.Tag())
        }
    }
}

数据转换

类型转换

安全的数据类型转换:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 字符串转数字
    str := "123"
    num, err := strconv.Atoi(str)
    if err != nil {
        panic(err)
    }
    fmt.Printf("字符串 '%s' 转换为数字: %d\n", str, num)

    // 数字转字符串
    num = 456
    str = strconv.Itoa(num)
    fmt.Printf("数字 %d 转换为字符串: '%s'\n", num, str)

    // 浮点数转换
    floatStr := "3.14"
    float, err := strconv.ParseFloat(floatStr, 64)
    if err != nil {
        panic(err)
    }
    fmt.Printf("字符串 '%s' 转换为浮点数: %f\n", floatStr, float)
}

数据压缩

使用 gzip

数据压缩和解压:

package main

import (
    "compress/gzip"
    "io"
    "os"
)

func main() {
    // 压缩数据
    file, err := os.Create("data.gz")
    if err != nil {
        panic(err)
    }
    
    gzWriter := gzip.NewWriter(file)
    _, err = gzWriter.Write([]byte("这是要压缩的数据"))
    if err != nil {
        panic(err)
    }
    
    gzWriter.Close()
    file.Close()

    // 解压数据
    file, err = os.Open("data.gz")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    gzReader, err := gzip.NewReader(file)
    if err != nil {
        panic(err)
    }
    defer gzReader.Close()

    data, err := io.ReadAll(gzReader)
    if err != nil {
        panic(err)
    }
    
    fmt.Println(string(data))
}

总结

Go 语言提供了丰富的数据处理功能,从基本的 JSON、CSV、XML 处理到大数据流式处理,再到数据验证、转换和压缩,都有完善的支持。在实际开发中,选择合适的数据处理方式对于提高程序的性能和可维护性至关重要。建议开发者根据具体场景选择最适合的数据处理方案,并注意处理过程中的错误处理和性能优化。

搜索