Эффективные способы записи CSV-файлов из структур в Golang

В этой статье блога мы рассмотрим различные методы записи CSV-файлов из структур на языке программирования Go. Мы предоставим примеры кода для каждого метода, что позволит вам выбрать тот, который лучше всего соответствует вашим потребностям. К концу этой статьи вы получите четкое представление о различных подходах и сможете писать эффективные CSV-файлы из структур в Go.

Метод 1: использование пакета “encoding/csv”
Пример кода:

package main
import (
    "encoding/csv"
    "os"
)
type Person struct {
    Name  string
    Email string
    Phone string
}
func main() {
    people := []Person{
        {Name: "John Doe", Email: "johndoe@example.com", Phone: "123456789"},
        {Name: "Jane Smith", Email: "janesmith@example.com", Phone: "987654321"},
    }
    file, err := os.Create("people.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    writer := csv.NewWriter(file)
    defer writer.Flush()
    for _, person := range people {
        data := []string{person.Name, person.Email, person.Phone}
        err := writer.Write(data)
        if err != nil {
            panic(err)
        }
    }
}

Метод 2: использование пакетов «encoding/csv» и «reflect».
Пример кода:

package main
import (
    "encoding/csv"
    "os"
    "reflect"
)
type Person struct {
    Name  string
    Email string
    Phone string
}
func main() {
    people := []Person{
        {Name: "John Doe", Email: "johndoe@example.com", Phone: "123456789"},
        {Name: "Jane Smith", Email: "janesmith@example.com", Phone: "987654321"},
    }
    file, err := os.Create("people.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    writer := csv.NewWriter(file)
    defer writer.Flush()
    headers := getHeaders(people[0])
    err = writer.Write(headers)
    if err != nil {
        panic(err)
    }
    for _, person := range people {
        data := getValues(person)
        err := writer.Write(data)
        if err != nil {
            panic(err)
        }
    }
}
func getHeaders(data interface{}) []string {
    t := reflect.TypeOf(data)
    headers := make([]string, t.NumField())
    for i := 0; i < t.NumField(); i++ {
        headers[i] = t.Field(i).Name
    }
    return headers
}
func getValues(data interface{}) []string {
    v := reflect.ValueOf(data)
    values := make([]string, v.NumField())
    for i := 0; i < v.NumField(); i++ {
        values[i] = v.Field(i).String()
    }
    return values
}

Метод 3: использование пакета go-csv
Пример кода:

package main
import (
    "github.com/gocarina/gocsv"
    "os"
)
type Person struct {
    Name  string `csv:"name"`
    Email string `csv:"email"`
    Phone string `csv:"phone"`
}
func main() {
    people := []Person{
        {Name: "John Doe", Email: "johndoe@example.com", Phone: "123456789"},
        {Name: "Jane Smith", Email: "janesmith@example.com", Phone: "987654321"},
    }
    file, err := os.Create("people.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    err = gocsv.MarshalFile(&people, file)
    if err != nil {
        panic(err)
    }
}

В этой статье мы рассмотрели три различных метода записи CSV-файлов из структур в Golang. Метод 1 использует стандартный пакет «encoding/csv», метод 2 использует пакеты «encoding/csv» и «reflect», а метод 3 использует пакет «go-csv». Каждый метод имеет свои преимущества и может подойти для разных сценариев.