gpt4 book ai didi

go - 如何通过检查 Golang 来解决此迭代?

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:41 24 4
gpt4 key购买 nike

我有一些 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 文件中写入的行数限制为例如500,000 行,没有分隔相同 name 的行(来自 names slice )。

例如,name1 有 200,000 个 MyStruct 行,name2 有 289,000 个 MyStruct 行,name3 有 180,000 个 MyStruct 行。由于从 name1name3 的总行数已经超过 500,000,我希望将其写入单个 csv 文件中。之后,我想继续获取 name4name5 等的 MyStruct 数据,直到它们的总数再次超过 500,000。

此外,由于我使用的是 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
}
}

要同时执行此操作,您需要查看 channel 和 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
}
}

关于go - 如何通过检查 Golang 来解决此迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50758577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com