如何使用签入Golang解决此迭代?

如何使用签入Golang解决此迭代?,go,concurrency,Go,Concurrency,我有一些Golang代码,如下所示 package main type MyStruct struct { field1 string field2 float64 field3 int field4 bool } func main() { names := getNames() myStruct := getMyStruct(names) writeToCsv(myStruct) } func getNames() []strin

我有一些Golang代码,如下所示

package main

type MyStruct struct {
    field1 string
    field2 float64
    field3 int
    field4 bool
}

func main() {
    names := getNames()
    myStruct := getMyStruct(names)
    writeToCsv(myStruct)
}

func getNames() []string {
    // get list of names then return
}

func getMyStruct(names []string) []Mystruct {
    myStruct := []MyStruct{}
    for i := range names {
        // do something then assign the computed values
        myStruct = append(myStruct, MyStruct{
            field1: value1,
            field2: value2,
            field3: value3,
            field4: value4,
        })
    }
    return myStruct
}

func writeToCsv(myStruct []MyStruct) {
    // prepare writer then write header
    for i := range myStruct {
        // create the slice of string to be written to csv
    }
}
它工作正常。但是,我希望能够将单个csv文件中写入的行数限制为500000行,而不分离相同
名称
(来自
名称
切片)的行

例如,
name1
有200000行MyStruct,
name2
有289000行MyStruct,
name3
有180000行MyStruct。由于从
name1
name3
的行总数已经超过500000行,因此我希望将其写入单个csv文件中。在那之后,我想继续获取MyStruct数据,比如
name4
name5
等等,直到它们的总数再次超过500000

另外,由于我使用的是Golang,我认为如果我也知道如何同时执行以下操作会更好:

1. Get the MyStruct rows
2. Write them to CSV
谢谢你的帮助


Edit1:如果有人能告诉我如何使用闭包解决上述问题(我认为这可能是一个可行的解决方案),我将不胜感激。

假设您的结构是按顺序生成的,诀窍是为行设置一个计数器并记住前面的值

func generate(structs []MyStruct) {
    var count = 0
    var previous = structs[0].name

    for _, s := range structs {
        if s.name != previous && count > 500000 {
            // flush your csv here
            count = 0
        }

        // append to your buffer here

        previous = s.name
    }
}
要同时执行此操作,您需要查看通道和goroutine

比如说

func makeStructs(names []string) chan MyStruct {
    var c = make(chan MyStruct)
    go func() {
        for _, n := range names {
            // do you thing
            c <- struct{...}
        }
        close(c)
    }()
}

func generate(structs chan MyStruct) {
    var count = 0
    var previous = ""

    for s := range structs {
        if s.name != previous && count > 500000 {
            // flush your csv here
            count = 0
        }

        // append to your buffer here

        previous = s.name
    }
}
func makeStructs(名称[]字符串)chan MyStruct{
var c=制造(chan MyStruct)
go func(){
对于u,n:=范围名称{
//你知道吗
c 500000{
//在这里刷新您的csv
计数=0
}
//在这里附加到缓冲区
previous=s.name
}
}