如何使用签入Golang解决此迭代?
我有一些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
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
}
}