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 处理到大数据流式处理,再到数据验证、转换和压缩,都有完善的支持。在实际开发中,选择合适的数据处理方式对于提高程序的性能和可维护性至关重要。建议开发者根据具体场景选择最适合的数据处理方案,并注意处理过程中的错误处理和性能优化。