Golang在循环中如何写入到单独的文件

Golang在循环中如何写入到单独的文件 我有一个简单的 for 循环,如下所示:

for i := 0; i < len(Item.Url); i++ {
    Item.Request[i])
}

我希望为每个 [i] 编写一个函数,将结果写入单独的文件,例如 log_1、log_2、log_3。

func WriteResults(filename string, result string) {
    f, err := os.Create(filename)
    if err != nil {
        log.Fatal(err)
        return
    }
    _, err = f.WriteString(result)
    if err != nil {
        log.Fatal(err)
        f.Close()
        return
    }
    err = f.Close()
    if err != nil {
        log.Fatal(err)
        return
    }
}

更多关于Golang在循环中如何写入到单独的文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好,@devdavid。我想我明白你想做什么,但我不太清楚你的问题是什么。你是想问如何创建带有递增计数的文件名?还是如何在循环中调用函数?或者是其他问题?

更多关于Golang在循环中如何写入到单独的文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


抱歉,如何在循环中调用我的写入函数,以便创建一个带有递增计数的独立文件。 如果我在循环内部调用我的写入函数,我只会得到一个包含多个内容的输出文件。

在循环中为每个迭代写入单独文件,可以通过动态生成文件名实现。以下是具体实现:

package main

import (
    "fmt"
    "os"
    "strconv"
)

func main() {
    // 示例数据
    Item := struct {
        Url     []string
        Request []string
    }{
        Url:     []string{"url1", "url2", "url3"},
        Request: []string{"result1", "result2", "result3"},
    }

    for i := 0; i < len(Item.Url); i++ {
        // 动态生成文件名
        filename := fmt.Sprintf("log_%d.txt", i+1)
        WriteResults(filename, Item.Request[i])
    }
}

func WriteResults(filename string, result string) {
    f, err := os.Create(filename)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    _, err = f.WriteString(result)
    if err != nil {
        panic(err)
    }
}

如果需要更灵活的文件命名,可以使用格式化字符串:

for i := 0; i < len(Item.Url); i++ {
    // 使用strconv格式化数字
    filename := "log_" + strconv.Itoa(i+1) + ".txt"
    WriteResults(filename, Item.Request[i])
}

对于并发写入场景,需要添加同步机制:

import "sync"

func main() {
    Item := struct {
        Url     []string
        Request []string
    }{
        Url:     []string{"url1", "url2", "url3"},
        Request: []string{"result1", "result2", "result3"},
    }

    var wg sync.WaitGroup
    for i := 0; i < len(Item.Url); i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            filename := fmt.Sprintf("log_%d.txt", index+1)
            WriteResults(filename, Item.Request[index])
        }(i)
    }
    wg.Wait()
}

如果需要在文件名中包含时间戳:

import "time"

for i := 0; i < len(Item.Url); i++ {
    timestamp := time.Now().Format("20060102_150405")
    filename := fmt.Sprintf("log_%d_%s.txt", i+1, timestamp)
    WriteResults(filename, Item.Request[i])
}
回到顶部